Помогает ли помещение команды в одинарные кавычки в сценарии bash? - PullRequest
1 голос
/ 18 февраля 2020

Я наткнулся на скрипт, в котором автор помещает каждую внешнюю команду (которая не является встроенной функцией или функцией) в одинарные кавычки. Поскольку я никогда раньше не видел этот стиль кодирования, мне интересно, есть ли разница между следующими двумя примерами:

'cat' $myfile

против

cat $myfile

Пожалуйста, игнорируйте тот факт, что автор решил не заключать в кавычки переменную, содержащую имя файла. Я определенно поместил бы это в двойные кавычки, и я знаю о влиянии кавычек вокруг переменной. Меня просто интересует, влияют ли кавычки на команду. Оба примера работают нормально, но, насколько я понимаю, одинарные кавычки здесь излишни. Это правильно?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 18 февраля 2020

Да, это имеет эффект, хотя в основном по очень загадочной причине:

Рассмотрим эту странную конструкцию

alias cat='echo x'
cat foo # would output x foo
'cat' foo # Would output the content of the file foo

Помещение в кавычки заставляет bash не запускать псевдоним , Этого эффекта можно было бы достичь также с помощью

command cat foo # Also outputs the file foo

Разница в том, что помещение команды в кавычки пропускает только определения псевдонимов, а при использовании command также пропускается определение функции. Поскольку псевдонимы обычно не включены в сценарии, использование кавычек редко используется.

1 голос
/ 18 февраля 2020

В большинстве случаев цитирование строки, в которой нет пробелов или специальных символов, строго эквивалентно тому, чтобы вообще не заключать в кавычки.

Однако в некоторых случаях цитирование имеет значение.

Предотвращение псевдонима

Во многих linux дистрибутивах автоматически устанавливаются псевдонимы для таких программ, как ls или grep, например:

alias ls='ls --color=auto'
alias grep='grep --color=auto'

Если вы вызываете указанную команду, псевдоним не будет быть расширен:

ls / # shows the root files and folders with colors
'ls' / # shows the root files and folders without any color

Псевдоним не используется, даже если команда частично заключена в кавычки:

'l's / # shows the root files and folders without any color

(я бы настоятельно рекомендовал не делать этого, хотя )

Зарезервированные ключевые слова

Некоторые ключевые слова не должны быть в кавычках. Например, это будет работать:

time cat $myfile

Но это не удастся:

'time' cat $myfile

- bash: время : команда не найдена

Расширение тильды

Символ тильды ~ может использоваться для доступа к домашнему каталогу. В одиночку он указывает на домашний каталог текущего пользователя:

ls ~

Когда непосредственно следует имя пользователя, он указывает на домашний каталог этого пользователя:

ls ~root

При цитировании символа тильды каталог не раскрывается, и оболочка пытается найти вместо него файл, содержащий символ тильды:

ls '~'

ls: невозможно получить доступ ~: нет такого файла или каталога

Тесты

Оператор [[ ]] может использовать команды test, такие как -f, -e и др. c. Однако директива не должна быть заключена в кавычки.

[[ -e /tmp ]] && echo /tmp exists || echo /tmp is missing

/ tmp существует

[[ '-e' /tmp ]] && echo /tmp exists || echo /tmp is missing

- bash: ожидается условный двоичный оператор

- bash: синтаксическая ошибка около `/ tmp '

Заключение

Во многих случаях цитирование выполняется Сделать разницу. Я думаю, что первая ситуация - причина, по которой ваш автор написал код.

PS. этот список не является исчерпывающим, особенно я пропустил такие случаи, как пробелы, звездочки, трубы, амперсанды и т. д. c. потому что я предполагаю, что вы уже знаете, почему кто-то хотел бы процитировать их.

...