Bash
Ici des documents et ici des cordes
Recherche…
En retrait ici des documents
Vous pouvez indenter le texte à l'intérieur des documents avec des tabulations, vous devez utiliser l'opérateur <<-
redirection au lieu de <<
:
$ cat <<- EOF
This is some content indented with tabs `\t`.
You cannot indent with spaces you __have__ to use tabs.
Bash will remove empty space before these lines.
__Note__: Be sure to replace spaces with tabs when copying this example.
EOF
This is some content indented with tabs _\t_.
You cannot indent with spaces you __have__ to use tabs.
Bash will remove empty space before these lines.
__Note__: Be sure to replace spaces with tabs when copying this example.
Un cas d'utilisation pratique (comme mentionné dans man bash
) est dans les scripts shell, par exemple:
if cond; then
cat <<- EOF
hello
there
EOF
fi
Il est habituel d'indenter les lignes dans les blocs de code, comme dans cette instruction if
, pour une meilleure lisibilité. Sans la syntaxe de l'opérateur <<-
, nous serions obligés d'écrire le code ci-dessus comme ceci:
if cond; then
cat << EOF
hello
there
EOF
fi
C'est très désagréable à lire, et ça empire dans un scénario réaliste plus complexe.
Ici des cordes
Vous pouvez alimenter une commande en utilisant les chaînes comme ceci:
$ awk '{print $2}' <<< "hello world - how are you?"
world
$ awk '{print $1}' <<< "hello how are you
> she is fine"
hello
she
Vous pouvez également alimenter une while
boucle avec une chaîne ici:
$ while IFS=" " read -r word1 word2 rest
> do
> echo "$word1"
> done <<< "hello how are you - i am fine"
hello
Limite des cordes
Un heredoc utilise la chaîne de limitation pour déterminer quand arrêter de consommer les entrées. La terminaison limite doit
- Être au début d'une ligne.
- Soyez le seul texte sur la ligne Note: Si vous utilisez
<<-
la chaîne de limitation peut être préfixée avec des tabulations\t
Correct:
cat <<limitstring
line 1
line 2
limitstring
Cela va sortir:
line 1 line 2
Utilisation incorrecte:
cat <<limitstring
line 1
line 2
limitstring
Comme la limitstring
sur la dernière ligne n'est pas exactement au début de la ligne, le shell continuera d'attendre d'autres entrées, jusqu'à ce qu'il voie une ligne qui commence par limitstring
et ne contienne rien d'autre. Ce n’est qu’à ce moment-là qu’il arrêtera d’attendre la saisie, et passera ensuite le document ici à la commande cat
.
Notez que lorsque vous préfixez la chaîne de limitation initiale avec un trait d'union, tous les onglets au début de la ligne sont supprimés avant l'analyse, ainsi les données et la chaîne de limite peuvent être indentées avec des tabulations
cat <<-limitstring
line 1 has a tab each before the words line and has
line 2 has two leading tabs
limitstring
produira
line 1 has a tab each before the words line and has line 2 has two leading tabs
avec les onglets principaux (mais pas les onglets internes) supprimés.
Créer un fichier
Une utilisation classique des documents ici est de créer un fichier en tapant son contenu:
cat > fruits.txt << EOF
apple
orange
lemon
EOF
Le document ici est les lignes entre les << EOF
et EOF
.
Ce document ici devient l'entrée de la commande cat
. La commande cat
sort simplement son entrée, et en utilisant l'opérateur de redirection de sortie >
nous redirigeons vers un fichier fruits.txt
.
Par conséquent, le fichier fruits.txt
contiendra les lignes:
apple
orange
lemon
Les règles habituelles de redirection de sortie s'appliquent: si le fruits.txt
n'existait pas auparavant, il sera créé. S'il existait auparavant, il sera tronqué.
Exécuter la commande avec ici le document
ssh -p 21 [email protected] <<EOF
echo 'printing pwd'
echo "\$(pwd)"
ls -a
find '*.txt'
EOF
$
est échappé car nous ne voulons pas qu'il soit développé par le shell courant, c'est- $(pwd)
dire que $(pwd)
doit être exécuté sur le shell distant.
Autrement:
ssh -p 21 [email protected] <<'EOF'
echo 'printing pwd'
echo "$(pwd)"
ls -a
find '*.txt'
EOF
Note : La fermeture EOF devrait être au début de la ligne (Pas d'espaces blancs auparavant). Si l'indentation est requise, des onglets peuvent être utilisés si vous démarrez votre heredoc avec <<-
. Reportez-vous aux exemples Indenting here documents et Limit Strings pour plus d'informations.
Exécuter plusieurs commandes avec sudo
sudo -s <<EOF
a='var'
echo 'Running serveral commands with sudo'
mktemp -d
echo "\$a"
EOF
-
$a
doit être échappé pour empêcher son extension par le shell actuel
Ou
sudo -s <<'EOF'
a='var'
echo 'Running serveral commands with sudo'
mktemp -d
echo "$a"
EOF