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; }