7 votes

Espaces dans les commandes avec redirection

program 2> error.log 
program &> filename 
program >> filename 2>&1
program 2>&1

J'ai pu comprendre la signification de ces lignes.

Cependant, je ne comprends pas très bien où je dois mettre les espaces. Je crains également que l'emplacement des espaces n'ait pas d'importance. Merci pour votre lecture.

12voto

Sergiy Kolodyazhnyy Points 97292

Oui, l'espacement entre les mots et les redirections n'a pas d'importance. C'est la réponse courte.

Les détails résident dans le fait que Shell (pour simplifier, appelons-le simplement bash uniquement) traite certains caractères et groupes de caractères comme des "mots" et des "métacaractères". Extrait du manuel de bash 4.3 :

métacaractère

Caractère qui, lorsqu'il n'est pas mis entre guillemets, sépare les mots. L'un des éléments suivants :

|  & ; ( ) < > space tab

Y

mot Séquence de caractères considérée comme une seule unité par le Shell. Également connu sous le nom de jeton.

Ainsi, lorsque nous le faisons :

$ echo "hello world">/dev/null

または

$ echo "hello world" > /dev/null

c'est toujours 3 mots ("hello world" peut être considéré comme un seul mot Shell parce qu'il est cité), avec une > méta-caractère et couple d'espaces. Shell le verra et effectuera d'abord une redirection (il cherchera donc d'abord les métacaractères), puis exécutera les commandes conformément à son comportement standard.

L'ordre des redirections a cependant beaucoup d'importance, en particulier lorsque vous dupliquez des descripteurs de fichiers avec quelque chose comme 2>&1 . Disons que vous voulez envoyer stderr et stdin au même endroit. Voici une mauvaise façon de procéder :

$ stat ./non-existent file 2>&1  > /dev/null
stat: cannot stat './non-existent': No such file or directory
stat: cannot stat 'file': No such file or directory

Vous créez un descripteur de fichier 2 au même endroit que 1 qui est votre terminal, mais c'est ce qu'il faisait déjà. C'est pourquoi stderr apparaît.

Si vous redirigez stdout d'abord, et ensuite seulement, modifier l'endroit où 2 points - alors cela fonctionnera :

$ stat ./non-existent file > /dev/null 2>&1

1voto

Özkan Aydemir Points 11

L'espacement n'a pas d'importance, sauf dans quelques cas particuliers.

  1. Vous avez un chiffre avant la redirection de la sortie standard.
    Selon la Manuel Bash :

si le numéro du descripteur de fichier est omis et que le premier caractère de l'opérateur de redirection est '<', la redirection se réfère à l'entrée standard (descripteur de fichier 0). Si le premier caractère de l'opérateur de redirection est '>', la redirection se réfère à la sortie standard (descripteur de fichier 1).

Ainsi, par exemple, echo test 2 > output.txt sera interprété comme echo test 2 1> output.txt c'est-à-dire rediriger le stdout de la commande echo test 2 dans le fichier output.txt, ce qui créera un fichier contenant le texte "test 2".
D'autre part, echo test 2> output.txt sera interprété comme "rediriger le stderr (descripteur de fichier 2) de la commande echo test dans le fichier output.txt", qui sera vide car le stderr de la commande est vide.
Ce comportement n'est pas limité aux chiffres 1 et 2. Ainsi, les echo test 5> output.txt créera également un fichier vide.

  1. Lors de l'utilisation de la substitution de processus sous la forme <(...) ou >(...) , espace entre les parenthèses de gauche et le > ou le <. n'est pas autorisé .

Notez qu'aucun espace ne doit apparaître entre le < ou le > et la parenthèse gauche, sinon la construction serait interprétée comme une redirection.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X