2014-04-30 4 views
2

Cela m'embrouille quand je vois un crochet et une virgule sur le script. Je ne peux pas vraiment comprendre comment ça se fait. Par exempleQue font les parenthèses et les virgules?

find /work \(-fprint /dev/stderr \) , \(-name 'core' -exec rm {} \; \)

Question: - -Que faire le support? - Que fait la virgule? - où puis-je obtenir ce manuel sur le mot-clé bracket et virgule dans bash.

+0

'man bash' ????? – John3136

+0

Recherchez 'man find' sur votre ordinateur. Ou consultez les [pages man sur le web] (http://www.linuxmanpages.com/man1/find.1.php). –

+0

Merci. Je vais regarder dedans – taymedee

Répondre

2

Les parenthèses/parenthèses sont utilisées par find pour imposer la priorité parmi ses prédicats. La virgule est un opérateur dans GNU find qui évalue à la fois le prédicat précédent et le prédicat qui suit, mais ignore le résultat du premier. Dans votre commande

find /work \(-fprint /dev/stderr \) , \(-name 'core' -exec rm {} \; \) 

vous avez deux (composé) prédicats:

  • -fprintf /dev/stderr
  • -name 'core' -exec rm {} \;

La première imprime le nom du fichier trouvé à l'erreur standard. Le second supprime uniquement les fichiers dont le nom est core. Sans la virgule, seuls les noms du fichier en cours de suppression seraient écrits sur la sortie standard; c'est-à-dire que la virgule remplace la and implicite effectuée sur plusieurs prédicats. (Les parenthèses autour du -fprintf pourraient être facultatives, puisqu'elles forment juste un groupe composé d'un seul prédicat, mais je ne suis pas positif.)

+0

Comme vous l'avez dit, le premier affiche le nom du fichier trouvé à l'erreur standard, puis quel mot-clé afficher la liste à afficher? – taymedee

+0

Si absolument, positivement, vous devez écrire à l'écran, utilisez '/ dev/tty'. Cependant, il est généralement préférable d'écrire dans '/ dev/stderr' (pour les erreurs) ou'/dev/stdout' (pour la sortie réelle), et de laisser l'utilisateur de la commande décider si ces descripteurs doivent pointer vers le terminal ou un autre fichier ou pipeline. Au démarrage, la sortie et l'erreur standard de votre shell sont liées au terminal/à l'écran, et tous les programmes lancés par le shell héritent de ces mêmes descripteurs de fichiers, sauf s'ils sont explicitement modifiés. – chepner

+0

Cela a du sens, merci pour votre merveilleuse explication :) – taymedee

2

( et ) sont utilisés dans bash pour exécuter une ou plusieurs commandes dans un sous-shell. Vous pouvez trouver plus sur ce sujet au http://www.tldp.org/LDP/abs/html/subshells.html.

Cependant, dans la commande que vous avez publiée, ils ne sont pas utilisés par bash puisqu'ils sont échappés - vous utilisez \( au lieu de seulement (. Par conséquent, ( et ) sont passés à find comme arguments. Notez également que ; est également échappé car il a une signification spéciale dans bash. En ce qui find est concerné, il voit les arguments suivants:

/work (-fprint /dev/stderr) , (-name 'core' -exec rm {} ;) 

La virgule (,) fait partie de la commande find. bash ne fait rien avec.

+0

Laissez-moi deviner, cela signifie trouver tout ce qui se trouve dans le répertoire 'work' et l'imprimer dans/dev/stderr, pendant ce temps, il supprimera le fichier contenant 'core' dans le contenu du fichier? – taymedee

+0

La première partie est juste. La deuxième partie signifie supprimer tous les fichiers nommés (c'est ce que l'indicateur '-name' représente)' core' sous '/ work' ou l'un de ses sous-répertoires. –

+0

@R Sahu je vois, merci :) – taymedee

Questions connexes