Когда вы передаете дополнительные аргументы после -c
, они помещаются в argv оболочки во время выполнения этой команды. Вы можете видеть, что как так:
bash -l -c '/bin/echo "$0" "[email protected]"' hello world
... так, эти аргументы не помещаются в командной строке эхо (если вы не выходите из своего пути, чтобы сделать это так), но вместо этого положите в командной строке оболочки, о которой вы говорите, чтобы запустить echo без аргументов.
То есть: При запуске
bash -l -c /bin/echo hello
... это эквивалент этого:
(exec -a hello bash -c /bin/echo)
... который ставит hello
в $0
из Баша, который работает только /bin/echo
, Так как бег /bin/echo
не выглядит на $0
, конечно, он не собирается печатать hello
.
Теперь, поскольку выполнение вещей через ssh означает, что вы проходите два этапа расширения оболочки, это добавляет дополнительную сложность. К счастью, вы можете иметь оболочку обрабатывать, что для вас автоматически, например, так:
printf -v cmd_str '%q ' bash -l -c '/bin/echo "$0" "[email protected]"' hello world
ssh remote_host "$cmd_str"
Это говорит Баш (printf %q
является расширением баш, не доступен в POSIX Printf) процитировать вашу команду так, что она расширяется в себя, когда обрабатывается оболочкой, затем подает результат на ssh
.
Все, что сказал - лечение $0
как обычный параметр является плохой практикой, и, как правило, не должно быть сделано в отсутствие конкретного и убедительных причин. Right Thing больше напоминает следующее:
printf -v cmd '%q ' /bin/echo hello world # your command
printf -v cmd '%q ' bash -l -c "$cmd" # your command, in a login shell
ssh remotehost "$cmd" # your command, in a login shell, in ssh
'SSH example_host 'баш -l -c "/ бен/эхо привет"'' –