1

Я столкнулся с чем-то, чего я не понимаю, и мне удалось воспроизвести ситуацию в сценарии ниже.

Если я получу исходный текст сценария, он потерпит неудачу с head: 1: invalid number of lines . Но если сценарий выполняется как сценарий, он успешен.

# !/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

Отладка вывода, если он получен и затем вызван (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

Отладка вывода, если выполняется напрямую:

+ /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

Таким образом, кажется, что в первом случае аргумент присваивания $line указывается в кавычках: + local 'line=1' против ++ local line=1 , что, похоже, приводит к разным результатам, почему так? Также, если line переменная не является локальной, кавычки перемещаются в переменную: ++ line='1'

Эти результаты получены из GNU bash, версия 4.2.46(1)-релиз (x86_64-redhat-linux-gnu).

Редактировать:

Явно используйте /usr/bin/head => те же результаты.

1 ответ1

1

У grep был псевдоним, который всегда окрашивал, что приводило к ошибкам и, вероятно, оставляло некоторую escape-последовательность, которая не появлялась с set -x .

Таким образом, решение этой конкретной проблемы заключается в явном выполнении grep без цветов ... | grep --color=never , минуя псевдоним, используя \ ... | \grep ...

Благодаря Теодену, который привел меня в правильном направлении.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .