Что такое команда sh -c?


31

Я обнаружил sh -cкоманду. Я нашел его до того, как опубликовал здесь, но не могу найти ни одного сообщения от Google, объясняющего это, поэтому я хотел бы знать, что это такое и каков его полный синтаксис.

Ответы:


34

shвызывает программу shкак интерпретатор, а -cфлаг означает выполнение следующей команды, интерпретируемой этой программой.

В Ubuntu shобычно используется символическая ссылка /bin/dash, означающая, что если вы выполняете команду с панелью sh -cdash, для ее выполнения будет использоваться команда вместо 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

Можете ли вы привести пример использования sh -c? Было бы очень хорошо, если бы он демонстрировал назначение позиционных параметров, которые упомянуты в -cчасти man sh.
Edwinksl

15

-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"

11

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 ...

+1 "sh -c порождает не-логин, неинтерактивный сеанс sh"
JSON C11
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.