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

2.05b

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


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow