2

Есть код, который я использовал для тестов

hola="cd /var && ssh localhost.error" $hola echo $?

Выполняя просто

cd /var && ssh localhost.error

вернет код 255.

Но выполнение

hola="cd /var && ssh localhost.error" $hola

возвращает 0, в то время как ожидается 255.

hola="ssh localhost.error" $hola

возвращает 255

Зачем?

2 ответа2

1
hola="cd /var && ssh localhost.error"
$hola

Когда вы делаете это, вторая строка заставляет вас вызывать команду cd с аргументами /var , && , ssh и localhost.error . Cd игнорирует все, кроме первого аргумента, и он успешно изменяется на /var, поэтому он не выводит ошибку.

Это происходит из-за порядка, в котором bash обрабатывает командные строки. Когда вы набираете cd /var && ssh localhost.error , это в терминах bash представляет собой список из двух команд s. Bash анализирует списки по отдельным командам, а затем анализирует каждую команду. Расширение переменной происходит при разборе команды, а не при разборе списка.

Когда вы запускаете $hola , анализатор списка анализирует его как одну команду. анализатор команд запускается, раскрывает переменную и видит &&, но он не является особенным для анализатора команд.

Вместо этого вы можете попробовать использовать функцию оболочки:

function hola { cd /var && ssh localhost.error; }
0

Это может быть связано с тем, что вы не запускаете команду в той же строке, а сохраняете строку с помощью команды и затем вызываете переменную, содержащую эту строку.

Попробуйте это вместо этого:

hola=$(cd /var && ssh localhost.error)
echo $hola

Это должно вернуть 255 или любой код ошибки, который вы ожидаете.

Посмотрите на этот пример:

> hola="echo hi"
> $hola
hi
>echo $?
0

> hola="hi"
> $hola
ksh: hi:  not found
> echo $?
127

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