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


31

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

Відповіді:


34

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

Чи можете ви навести приклад використання 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 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"

11

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

+1 "sh -c породжує неінтерактивну сесію sh"
JSON C11
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.