Les guillemets empêchent l'expansion des paramètres
Sans guillemets:
a=0
cat <
Output:
0
Avec guillemets:
a=0
cat <<'EOF'
$a
EOF
ou (moche mais valide):
a=0
cat <
Sortie:
$a
Le tiret enlève les tabulations initiales
Sans tiret:
cat <a
EOF
où est une tabulation littérale, et peut être insérée avec Ctrl + V
Sortie:
a
Avec tiret:
cat <<-EOF
a
EOF
Sortie:
a
Cela existe bien sûr pour pouvoir indenter votre cat
comme le code environnant, ce qui est plus facile à lire et à maintenir. Par exemple:
if true; then
cat <<-EOF
a
EOF
fi
Malheureusement, cette méthode ne fonctionne pas avec les espaces : POSIX a favorisé l'indentation avec les tabulations. Oups.
POSIX 7
kennytm a cité man bash
, mais la plupart de cela est aussi du POSIX 7: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_07_04 :
Les opérateurs de redirection "<<" et "<<-" permettent tous deux de rediriger des lignes contenues dans un fichier d'entrée du shell, appelé "here-document", vers l'entrée d'une commande.
Le here-document doit être traité comme un seul mot qui commence après le prochain et se poursuit jusqu'à ce qu'il y ait une ligne contenant uniquement le délimiteur et un , sans caractères entre les deux. Ensuite, le prochain here-document démarre, s'il y en a un. Le format est le suivant:
[n]<
`
où le n optionnel représente le numéro de descripteur de fichier. Si le numéro est omis, le here-document fait référence à l'entrée standard (descripteur de fichier 0).
Si un caractère de word est entre guillemets, le délimiteur est formé en effectuant la suppression des guillemets sur word, et les lignes du here-document ne seront pas étendues. Sinon, le délimiteur est word lui-même.
Si aucun caractère de word n'est entre guillemets, toutes les lignes du here-document seront étendues pour l'expansion des paramètres, la substitution de commandes et l'expansion arithmétique. Dans ce cas, le backslash dans l'entrée se comporte comme le backslash à l'intérieur des guillemets doubles (voir Guillemets Doubles). Cependant, le caractère de guillemet double ('"') ne sera pas traité de manière spéciale à l'intérieur d'un here-document, sauf lorsque le guillemet double apparaît dans "$()", "``", ou "${}".
Si le symbole de redirection est "<<-", tous les caractères de tabulation initiaux seront supprimés des lignes d'entrée et de la ligne contenant le délimiteur final. Si plus d'un opérateur "<<" ou "<<-" est spécifié sur une ligne, le here-document associé au premier opérateur sera fourni en premier par l'application et sera lu en premier par le shell.
Lorsqu'un here-document est lu à partir d'un terminal et que le shell est interactif, il écrira le contenu de la variable PS2, traité comme décrit dans les Variables du Shell, sur la sortie standard d'erreur avant de lire chaque ligne d'entrée jusqu'à ce que le délimiteur soit reconnu.
`
``` ````
34 votes
C'est probablement une utilisation inutile de
cat
. Essayezpsql ... << EOF ...
Voir aussi "here strings". mywiki.wooledge.org/BashGuide/InputAndOutput?#Here_Strings1 votes
Je suis surpris que cela fonctionne avec cat mais pas avec echo. cat devrait s'attendre à un nom de fichier en tant que stdin, pas une chaîne de caractères. psql << EOF semble logique, mais pas autrement. Fonctionne avec cat mais pas avec echo. Comportement étrange. Une idée à ce sujet ?
0 votes
En me répondant : chat sans paramètres exécute et réplique en sortie tout ce qui est envoyé via l'entrée (stdin), utilisant ainsi sa sortie pour remplir le fichier via >. En fait, un nom de fichier lu comme un paramètre n'est pas un flux stdin.
0 votes
@Alex echo imprime simplement ses arguments de ligne de commande tandis que
cat
lit l'entrée standard (lorsqu'elle est dirigée vers lui) ou lit un fichier qui correspond à ses arguments de ligne de commande