1 votes

bash : Résultats différents si la même fonction est appelée depuis un script sourcé ou exécutée directement.

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.

1voto

mandrake Points 298

Il y avait un alias pour grep pour toujours colorer ce qui a fait foirer les choses et a probablement laissé une séquence d'échappement qui n'est pas apparu avec set -x .

Donc la solution à ce problème particulier est soit d'exécuter grep explicitement sans couleurs ... | grep --color=never en contournant l'alias en utilisant \ ... | \grep ... .

Merci à Theoden qui m'a conduit dans la bonne direction.

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