Каково различие между $ (материал) и 'материалом'?

Править: Этот ответ является неправильным, но интересным, таким образом, я оставлю его для дальнейшего использования.


Добавление a ! к команде инвертирует код возврата.

http://tldp.org/LDP/abs/html/exit-status.html

# =========================================================== #
# Preceding a _pipe_ with ! inverts the exit status returned.
ls | bogus_command     # bash: bogus_command: command not found
echo $?                # 127

! ls | bogus_command   # bash: bogus_command: command not found
echo $?                # 0
# Note that the ! does not change the execution of the pipe.
# Only the exit status changes.
# =========================================================== #

268
12.01.2014, 04:21
6 ответов

Одинарные левые кавычки старого стиля ` ` действительно рассматривайте обратные косые черты и немного отличающееся вложение. Новый стиль $() интерпретирует все промежуточное ( ) как команда.

echo $(uname | $(echo cat))
Linux

echo `uname | `echo cat``
bash: command substitution: line 2: syntax error: unexpected end of file
echo cat

работы, если вложенных одинарных левых кавычек оставляют:

echo `uname | \`echo cat\``
Linux

забава обратной косой черты:

echo $(echo '\\')
\\

echo `echo '\\'`
\

Новый стиль $() относится ко всем совместимым на POSIX оболочкам.
Как mouviciel указанный, старого стиля ` ` могло бы быть необходимым для более старых оболочек.

Кроме технической точки зрения, старого стиля ` ` имеет также визуальный недостаток:

  • Трудно заметить: I like $(program) better than `program`
  • Легко перепутанный с одинарной кавычкой: '`'`''`''`'`''`'
  • Не настолько легкий ввести (возможно, даже на стандартном расположении клавиатуры)

(и использование SE ` ` для собственной цели это была боль, пишущий этот ответ :)

361
27.01.2020, 19:26
  • 1
    Единственная вещь, которую я добавил бы, то, что я звоню' (' paren, не скобка (который является' ['). –  Kendall Helmstetter Gelner 13.01.2011, 20:09
  • 2
    @Kendall: и здесь я думал '{' была левая скобка в течение всех тех лет... –  SamB 13.01.2011, 22:32
  • 3
    @Sam: { } обычно называется "фигурными скобками" или "заключает в фигурные скобки" en.wikipedia.org/wiki/Braces_ (пунктуация) #Braces –  Jørn Schou-Rode 13.01.2011, 23:35
  • 4
    я также обращаюсь к {'' как фигурные скобки. Хотя это кажется нечетным, необходимо добавить спецификатор, "изогнутый" при вызове других вещей скобками... Я предполагаю, что это просто, потому что они на самом деле завихряются. –  Kendall Helmstetter Gelner 14.01.2011, 06:23
  • 5
    @slim я не знаю на американских/британских клавиатурах, но на испанских клавиатурах ` мертвая клавиша, таким образом, я должен ввести любого двойная обратная галочка (что-то, что я обычно забываю, что могу даже сделать), или обратная галочка затем располагают с интервалами, который является болью. –  Darkhogg 04.04.2014, 19:39

Заметное отличие, которое я наблюдаю, - то, что Вы не можете вложить обратные галочки, в то время как можно вложить $(). Возможно, оба существуют по причинам прежней версии. Точно так же . и source команды являются синонимами.

41
27.01.2020, 19:26
  • 1
    Некоторые Полученные из границы оболочки не распознают source. Тире является одним примером. регистрация –  Paused until further notice. 13.01.2011, 18:40
  • 2
    Это не верно. Можно вложить обратную галочку к любому уровню, просто более мучительно. Отметьте это оба $(...) и `...` являются стандартными (последний, удержавший от использования) в то время как . является стандартным, но нет source –  Stéphane Chazelas 25.10.2012, 13:17
  • 3
    , только в (t)csh разве они не могут быть вложены. (t)csh не поддерживать $(...) все же. Они действительно поддерживают source (и нет .)все же. –  Stéphane Chazelas 01.08.2014, 15:28

$() не работает со старой Оболочкой Bourne. Но это были годы десятилетия, с тех пор как я работал со старой Оболочкой Bourne.

28
27.01.2020, 19:26

Другое примечание, $() будет использовать больше системного ресурса, чем использование обратных галочек, но немного быстрее.

В Освоении сценариев оболочки Unix Randal K. Michael сделал тест в главе, названной "24 Способа Обработать Файл Линию за линией".

6
27.01.2020, 19:26
  • 1
    Это требование не имеет смысла. Нет никакой причины, почему это должно быть быстрее, поскольку это просто использует другую нотацию для синтаксического анализатора. –  schily 06.09.2015, 16:17
  • 2
    @schily: Возможно, я только заключаю в кавычки из книги, можно считать ее для получения дополнительной информации. –  cuonglm 06.09.2015, 18:19
  • 3
    , который я был бы склонен согласовывать с @schily..., почему потребуется больше ресурсов? –  Wildcard 08.03.2016, 01:21
  • 4
    @Wildcard, я предполагаю, что это потому что $() делает Ваш сценарий на один байт больше, чем если бы он использовал ` (принятие Вас не вкладывает их и не использует обратные косые черты в). Относительно которого было бы быстрее для парсинга, который будет варьироваться между оболочками и был бы не важен как незначительный по сравнению со стоимостью создания канала и разветвления процесса, которые управляют, замена влечет за собой. –  Stéphane Chazelas 02.12.2016, 11:45
Синтаксис [11882]$()[11883] не будет работать со старой оболочкой Борна. [11884] С новыми оболочками [11885]``[11886] и [11887]$()[11888] эквивалентны, но [11889]$()[11890] намного удобнее использовать, когда нужно вложить несколько команд. [12182]Например :[12183] легче набирать и отлаживать, чем :[12184]
1
27.01.2020, 19:26

В дополнение к сказанному другими здесь, вы можете использовать обратные знаки для имитации встроенных комментариев:

echo foo `# I'm a comment!` bar

Вывод: foo bar.

Для получения дополнительной информации см: https://stackoverflow.com/a/12797512 (Обратите внимание также на комментарии под этим постом.)

8
20.08.2021, 13:38

Теги

Похожие вопросы