Ответы:
sh
вызывает программу sh
как интерпретатор, а -c
флаг означает выполнение следующей команды, интерпретируемой этой программой.
В Ubuntu sh
обычно используется символическая ссылка /bin/dash
, означающая, что если вы выполняете команду с панелью sh -c
dash, для ее выполнения будет использоваться команда вместо bash. Оболочка, вызываемая с помощью, sh
зависит от символической ссылки - вы можете узнать с помощью readlink -e $(which sh)
. Вы должны использовать, sh -c
когда вы хотите выполнить команду именно с этой оболочкой вместо bash.
Вы можете использовать этот синтаксис ( -c
флаг) и с другими интерпретаторами. Одно из его классических применений (на что указывает @edwinksl - обойти проблему перенаправления, не работающего с sudo (здесь вы можете использовать bash -c
или sh -c
)
sudo sh -c 'echo "foo" > /home/bar'
запишет файл , bar
содержащий текст foo
к /home/
, в то время как sudo echo "foo" > /home/bar
не удается , как описано здесь очень хорошо
Важно использовать «одинарные кавычки» вокруг командной строки, иначе текущая оболочка попытается развернуть ее, прежде чем она будет передана интерпретатору, который вы вызвали
например (с python, пока я не подумаю о команде, которая даст разные результаты в тире ...)
$ python3 -c print (35/7)
bash: syntax error near unexpected token `('
$ python3 -c 'print (35/7)'
5.0
-c
Аргумент:
Читайте команды из операнда command_string вместо стандартного ввода. Специальный параметр 0 будет установлен из операнда command_name, а позиционные параметры ($ 1, $ 2 и т. Д.) Установлены из оставшихся операндов аргумента.
Другие подробности об sh
арагментах можно узнать, запустив:
$ man sh
Пример использования строки в качестве аргумента:
$ sh -c "echo This is a test string"
Это более подробный sh -c
пример. Он загрузит документ с Google Диска и откроет его для редактирования на рабочем столе:
$ sh -c "wget 'https://docs.google.com/document/u/0/d/1jcBtdlMx0f4BhCmAmnIViIy4WN4oRevWFRzse-P00j0/export?format=docx' -O test.docx && xdg-open test.docx 2>/dev/null"
sh -c
порождает не-Логин , неинтерактивная сессия sh
( dash
в Ubuntu).
Команда следующие , которые будут работать в этой сессии оболочки, она будет рассматриваться в качестве аргумента (позиционного параметра) 0 ( ARGV0
), а оставшаяся часть в качестве аргумента этой команды ( ARGV0
), начиная с 1 ( ARGV1
, ARGV2
, ...).
Вы также можете использовать типичные функции оболочки, разрешенные для запуска в этом виде сеанса, например, разделение команд с ;
использованием нескольких команд, группирование с помощью команд {}
, создание другого подоболочки с помощью ()
и так далее. Их использование может немного изменить определения / примеры аргументов, упомянутые ранее.
Следует отметить, что функции, которые относятся только к интерактивным оболочкам (по умолчанию), например, расширение истории, source
-ing of ~/.bashrc
и /etc/bash.bashrc
т. Д., Не будут доступны в этом сеансе, поскольку они не являются интерактивными . Вы можете моделировать поведение интерактивных сеансов (почти), используя -i
опцию:
sh -ic ...
Аналогично, функции, которые относятся только к оболочкам входа в систему (по умолчанию), например, source
-ing of ~/.profile
(заданы ~/.bash_profile
и ~/.bash_login
не существуют), и /etc/profile
не будут выполняться, поскольку оболочка является оболочкой без регистрации . Вы можете смоделировать поведение логинов-оболочек, используя -l
опцию:
sh -lc ...
Для имитации входа в систему и интерактивных сеансов:
sh -lic ...
sh -c
? Было бы очень хорошо, если бы он демонстрировал назначение позиционных параметров, которые упомянуты в-c
частиman sh
.