Я столкнулся с чем-то, чего я не понимаю, и мне удалось воспроизвести ситуацию в сценарии ниже.
Если я получу исходный текст сценария, он потерпит неудачу с 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
=> те же результаты.