2016-03-03 2 views
0

Почему я получаю лишнюю пустую строку при запуске 2). Мне 1 нравится 2. Так почему же лишняя строка в 2)?Разница между Linux, когда использовать круглые скобки

1)

export p1=$(cd $(dirname $0) && pwd) 
#        ^
echo p1 

2)

export p2=$(cd $(dirname $0)) && pwd 
#       ^
echo p2 
+0

Использование обратных сигналов не рекомендуется. Вместо этого используйте $ (...), вы можете легко вложить его в него, и его легче читать. В блоке кода он должен быть доступен. –

+0

, потому что cd ничего не печатает на stdout. – anishsane

+1

Вы хотели бы эхо '$ p1' и' $ p2'? Основное различие заключается в том, захвачен ли вывод 'pwd' в переменной или нет. Что касается пустых строк, это похоже на то, что '$ (...)' удаляет завершающие символы новой строки (если не пустое пространство). –

ответ

0
$echo $0 
/bin/bash 
$ echo $(cd $(dirname $0) && pwd) 
/bin 
$ echo $(cd $(dirname $0)) && pwd 

/home/user 
$ 

В 1-м выражении это делается echo $(cd /bin && pwd). Поэтому внутренние 2 команды выполняются в подоболочке и возвращают значение pwd, которое затем эхо.

Во втором выражении оно уменьшается до echo $(cd /bin) && pwd. Поэтому только команда cd выполняется в подоболочке и ничего не возвращает для эха (поэтому по умолчанию echo просто печатает пустую строку). Поскольку эхо успешно прошло (код выхода = 0) && приводит к истине и pwd cmd запускается в текущей оболочке, а pwd печатается

0

р1 захватывает выход cd (пустой) и pwd.

p2 только фиксирует вывод cd, а затем запускает pwd без перенаправления.


echo p1 печатает буквальным p1 (с новой строки). Я полагаю, вы на самом деле не копировали-вставляете из своего терминала, а вместо этого набираете что-то еще.


[email protected]:~$ export p2=$(true) && pwd 
/home/peter 
[email protected]:~$ echo "x${p2}x" 
xx 

cd в субоболочке не влияет PWD родительской оболочки, так что я просто заменил команду true, чтобы сделать его более удобным для чтения.

Смежные вопросы