Відповіді:
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.