Відповіді:
sh
викликає програму sh
як інтерпретатора, а -c
прапор означає виконання наступної команди, яку інтерпретує ця програма.
У Ubuntu, sh
як правило, посилається на /bin/dash
, що означає, що якщо ви виконаєте команду з штрихом sh -c
оболонки, то буде виконуватися команда замість 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 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 -c
породжує НЕ-Логін , неінтерактивному сесія sh
( dash
в Ubuntu).
Команда наступні , які будуть працювати в цій сесії оболонки, вона буде розглядатися в якості аргументу (позиційного параметра) 0 ( ARGV0
), а частина, що залишилася в якості аргументу цієї команди ( ARGV0
), починаючи з 1 ( ARGV1
, ARGV2
, ...).
Ви також можете використовувати типові функції оболонки, дозволені для запуску в такому сеансі, наприклад, розділення команд ;
з використанням декількох команд, згрупування команд з використанням {}
, нерестування іншої підкашлю ()
і так далі. Використання цих даних може дещо змінити визначення аргументів / приклади, згадані раніше.
Зауважимо лише, що функції, характерні лише для інтерактивних оболонок (за замовчуванням), наприклад, розширення історії, source
-ing ~/.bashrc
та /etc/bash.bashrc
ін., Не будуть доступні в цьому сеансі, оскільки це не інтерактивний . Ви можете імітувати поведінку інтерактивних сеансів (майже), скориставшись -i
опцією:
sh -ic ...
Аналогічно функції, специфічні для оболонок входу (за замовчуванням), наприклад source
-ing ~/.profile
(надано ~/.bash_profile
та ~/.bash_login
не існує), і /etc/profile
не виконуватимуться, оскільки оболонка - оболонка, яка не входить у систему . Ви можете імітувати поведінку оболонок для входу за допомогою -l
параметра:
sh -lc ...
Щоб імітувати як вхід, так і інтерактивні сесії:
sh -lic ...
sh -c
? Було б дуже приємно, якщо воно демонструє призначення позиційних параметрів, які згадуються в-c
частиніman sh
.