Все три довольно отличаются от друг друга, особенно |
.
|
: В первую очередь, это назвало 'канал' и может использоваться для перенаправления вывода одной программы в другой. Ваш пример ничего на самом деле не сделает значимый tho, потому что человек не использует стандартный вход ни для чего. Более значимый пример был бы человек grep | grep-v
, который найдет '-v' в выводе от человек grep
;
: точка с запятой может использоваться вместо новой строки, чтобы заставить вещи занять меньше места.
&&
: два оператора амперсанда булевская переменная И оператор, что означает, что команда после &&
будет выполнен, если, и только если, команда на левой стороне возвращает true, который в системах UNIX означает, что это возвратилось с кодом выхода 0.
$cmd
не оценивает вашу переменную, а просто расширяет ее и передает в оболочку как строку, поэтому вы получаете ошибки. В вашем случае попробуйте eval "$cmd"
.
И в любом случае я бы предложил использовать $(ssh the_rest_of_your_command_line)
вместо eval "$cmd"
, так как eval
- плохая привычка.