Каков sh-c команда?

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

28
задан 1 October 2016 в 00:49

3 ответа

-c аргумент:

Read управляет от command_string операнда вместо от стандартного входа. Специальный параметр 0 будет установлен от command_name операнда и позиционных параметров (1$, 2$, и т.д.) набор от остающихся операндов аргумента.

Другие детали эти sh аргументы могут быть найдены путем выполнения:

$ man sh

пример использования строки, поскольку аргумент:

$ sh -c "echo This is a test string"

Это - более подробное sh -c пример. Это загрузит документ с Google Drive и откроет его для редактирования на рабочем столе:

$ 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"
15
ответ дан 23 November 2019 в 00:56

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

В Ubuntu, sh обычно symlinked к /bin/dash, подразумевать это, если Вы выполняете команду с sh -c оболочка тире будет использоваться для выполнения команды вместо удара. Оболочка, названная с sh зависит от символьной ссылки - можно узнать с readlink -e $(which sh). Необходимо использовать sh -c когда Вы хотите выполнить команду конкретно с той оболочкой вместо удара.

Можно использовать этот синтаксис ( -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
33
ответ дан 23 November 2019 в 00:56

sh -c порождает невход в систему, неинтерактивную сессию sh (dash в Ubuntu).

Команда после этого будет выполнена на той сессии оболочки, ее будут рассматривать как аргумент (позиционный параметр) 0 (ARGV0), и остающаяся часть как аргумент той команде (ARGV0), начиная от 1 (ARGV1, ARGV2, ...).

Можно также использовать типичные функции оболочки, позволенные работать в этом виде сессии, например, разделительного использования команды ; использовать несколько команд, использование группировки команды {}, породите другую подоболочку с (), и так далее. Использование их может немного изменить определения/примеры аргумента, упомянутые ранее.


Только для замечания, функции, которые характерны для интерактивных оболочек только (по умолчанию), например, расширения истории, source- луг ~/.bashrc и /etc/bash.bashrc и т.д. не будет доступно на этой сессии, поскольку это является неинтерактивным. Можно моделировать интерактивное поведение сессий (почти), при помощи -i опция:

sh -ic ...

Точно так же функции, которые конкретны для входа в систему в оболочки только (по умолчанию), например. source- луг ~/.profile (данный ~/.bash_profile и ~/.bash_login не существуйте), и /etc/profile не будет сделан, поскольку оболочка является оболочкой невхода в систему. Можно моделировать поведение оболочек входа в систему с помощью -l опция:

sh -lc ...

Моделировать и вход в систему и интерактивные сессии:

sh -lic ...
11
ответ дан 23 November 2019 в 00:56

Другие вопросы по тегам:

Похожие вопросы: