Яка перевага використання bash -c над використанням рядка тут?


11

Чи є реальна користь від використання bash -c 'some command'над використаннямbash <<< 'some command'

Вони ніби досягають однакового ефекту.



Привіт @Patrick дякую за повідомлення Я дійсно не був впевнений, де найкраще місце для публікації. Оскільки, з одного боку, це питання Linux, але з іншого боку bash - це різновид мови скриптування, а на іншому сайті більше відвідувачів. У такому випадку, де краще відповідне місце для розміщення?
yosefrow

4
@yosefrow: Будь-який сайт був би добре IMHO; але перехресне розміщення є неприємним (ви просите людей на обох сайтах витратити час на ваше запитання, не даючи їм користі відповіді один одного).
ruakh

Чи було б доречно видалити публікацію з одного із сайтів тоді?
yosefrow

2
Ще одна незначна відмінність полягає в тому, що bash -c '...'вони працюватимуть в оболонках, які не мають хребтів. Ви припускаєте, що bash буде викликатись в bash shell, але це не завжди так.
Джоел Корнетт

Відповіді:


21

bash -c 'some command'зберігає доступ до стандартного вводу абонента, тому readчи зчитування команд зі стандартного вводу буде працювати нормально. bash <<< 'some command'замінює цей вхід на рядок, що передається, так bash -c catі bash <<< catроби інші речі.

$ bash -c cat
abc
abc
^D
$ bash <<< cat
$

З іншого боку, ви можете скористатися цією функцією, щоб забезпечити власний стандартний вхід, який буде використовуватися $'...', якщо ви дуже обережні:

$ bash <<< $'read x y\nabc def ghi\necho $y'
def ghi
$

Я не хотів би на це покладатися, але це може бути зручно іноді.


bash -cтакож дозволяє передавати аргументи до сценарію та $0встановлювати:

bash -c 'some command' sh abc def

буде встановлений $1в abcі $2до defвнутрішньої some command.


3
Синтаксичні помилки також дадуть дещо інше формулювання. Головним чином, про bash -cщо згадують -c, AFAIK. Не зовсім безглуздо, оскільки це може допомогти їх відслідковувати. bash <<< 'script'помилки виглядають так само, як і в батьківському сценарії; bash -c 'script'ті ні. Ви можете навіть назвати їх: bash -c 'script' label.
derobert

Ну і bash <<< 'echo $1' /dev/stdin fooпрацює, і друкує foo. Хоча налаштування $0дещо обмеженіше.
ilkkachu

bash <<< 'echo "$1"' /dev/stdin fooне завжди працює. Я взявся bash <<< 'echo "$1"' -s fooна роботу.
G-Man каже: "Відновіть Моніку"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.