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