Je suis tombé sur quelque chose que je ne comprends pas, et j'ai réussi à reproduire la situation dans le script ci-dessous.
Si je source le script il échoue avec head: 1: invalid number of lines
. Mais si le script est exécuté comme un script il réussit.
# !/bin/bash
# test.sh
function getline {
local line=$(cat /etc/passwd | cut -d':' -f1 | grep --no-messages -nw "$1" | cut -d':' -f1)
/usr/bin/head -n $line /etc/passwd | tail -n 1
}
# Call the function
getline root
Sortie de débogage si la source et ensuite appelée ( set -x
)
+ getline root
++ cat /etc/passwd
++ cut -d: -f1
++ cut -d: -f1
++ grep --colour=always -niw root
+ local 'line=1'
+ tail -n 1
+ /usr/bin/head -n '1' /etc/passwd
/usr/bin/head: 1: invalid number of lines
Sortie de débogage si elle est exécutée directement :
+ /tmp/test.sh
++ getline root
+++ cat /etc/passwd
+++ cut -d: -f1
+++ cut -d: -f1
+++ grep -niw root
++ local line=1
++ /usr/bin/head -n 1 /etc/passwd
++ tail -n 1
root:-:-:-:root:/root:/bin/bash
Il semble donc que le $line
L'argument de l'affectation est cité dans le premier cas, + local 'line=1'
vs ++ local line=1
ce qui semble conduire à des résultats différents, pourquoi ? De même, si le line
La variable n'est pas locale, les guillemets se déplacent vers la variable : ++ line='1'
Ces résultats proviennent de GNU bash, version 4.2.46(1)-release (x86_64-redhat-linux-gnu).
Edit :
Utilisez explicitement /usr/bin/head
=> mêmes résultats.