Итак, если я использую команду if, как показано ниже, создается подоболочка:

if ! (ffmpeg -h > /dev/null 2>&1)
then
    echo "FFmpeg NOT INSTALLED"
.
.
.
fi

Что насчет var=$(<command>) и его эквивалента var=`<command>`? Будут ли они также создавать подоболочку?

2
terdon 18 Дек 2019 в 20:34
1
Да, подстановки команд, такие как a=$(...), создают подоболочку. В bash подоболочка всегда выполняется как отдельный процесс. Вам не нужна подоболочка в вашем примере ffmpeg — она будет работать без скобок.
 – 
mosvy
18 Дек 2019 в 20:37
2
Обратные кавычки и $(...) не полностью эквивалентны. Обратные кавычки, например, не вкладывают друг в друга.
 – 
Kusalananda
18 Дек 2019 в 21:48
Обратные кавычки, конечно, вставляются, если вы делаете это правильно. Есть еще реальная разница: с обратными кавычками строки передаются через синтаксический анализатор два раза, и это может неожиданно удалить обратную косую черту.
 – 
schily
19 Дек 2019 в 14:39
Возможно, мне следовало написать «не вкладываться так же, как это делает другой вариант подстановки команд». Дело в том, что они не «эквивалентны» в том смысле, что «вы можете просто заменить $( и ) обратными кавычками».
 – 
Kusalananda
19 Дек 2019 в 14:54
Важно то, что echo $(grep -l '\\n' *c) дает другой результат, если вы используете обратные кавычки...
 – 
schily
19 Дек 2019 в 16:16

2 ответа

Лучший ответ

Обе формы подстановки команд создают подоболочки.

3.5.4 Подстановка команд

Bash выполняет расширение, выполняя команду в среде подоболочки

0
jesse_b 18 Дек 2019 в 20:39

Если вы избегаете старой и трудно цитируемой подстановки команды галочки.

Тогда правило просто перифраз () создать подоболочку. Однако скобки {} этого не делают.

  • () подоболочка
  • $() подоболочка и подстановка
  • {} брекетинг без подоболочки
  • ${} замена переменной
0
ctrl-alt-delor 18 Дек 2019 в 21:45
1
Это становится немного сложнее, если учесть while и for и т. д.
 – 
terdon
18 Дек 2019 в 22:07