`date` просто расширится до вывода date
команды. Однако он удаляет лишние пробелы в тех местах, где в выводе содержится более одного последовательного пробела. (Это связано с тем, что подстановка команд подвержена разбиению слов и из-за того, как echo
команда обрабатывает несколько аргументов.)
В «date» двойные кавычки являются слабыми, поэтому они будут раскрывать переменные (попробуйте «$ PWD») и выполнять подстановку команд. Результат раскрытия передается команде как один аргумент echo
с включенными последовательными пробелами: то есть разделение слов не выполняется.
В `` date` ' одинарные кавычки являются более сильными кавычками, поэтому они не допускают расширения переменных или подстановки команд внутри них.
Перейдите по этой ссылке для получения дополнительной информации.
Отредактировал первый пункт, как правильно указал Михаэль Зельманн в комментарии ниже .
Чираг Бхатия - чираг64
источник
date
команда.И то и другое
а также
покажет дату. Выход из последнего выглядит как выход из запуска
date
сам по себе.Однако есть разница: тот, что заключен в
"
кавычки,"
будет отправленecho
как один аргумент. Кавычки инкапсулируют выходные данные всей команды как один аргумент. Так какecho
просто выводит свои аргументы по порядку, с пробелами между ними, он в основном будет выглядеть одинаково.Вот пример тонкой разницы:
производит:
но:
производит:
Обратите внимание, что два пробела после
Nov
были сокращены до одного без кавычек. Это связано с тем, что оболочка анализирует каждый разделенный пробелами элемент и отправляет результат в echo в качестве 6 аргументов. Когда вы цитируете его, echo получает один единственный аргумент, а кавычки сохраняют пробел.Это становится намного важнее в командах, отличных от echo. Например, представьте команду,
foo
которая хочет два аргумента: дату и адрес электронной почты.Это будет работать в этом сценарии:
Но это запутает скрипт, послав ему 7 аргументов:
источник
В оболочках POSIX,
`date`
это древняя форма подстановки команд. Современный синтаксис есть$(date)
.В обоих случаях они расширяются до выходных данных
date
с зачеркнутыми символами новой строки (при условии, что выходные данные не содержат NUL-символов).Однако, если не в двойных кавычках и в контекстах списка (например, в аргументах простых команд, как
echo
в вашем случае), это расширение дополнительно зависит от:Разделение слов : это означает, что «вывод
date
с разбитыми символами новой строки» разделяется в соответствии с текущим значением$IFS
переменной (по умолчанию содержит пробел, табуляцию и символ новой строки (и NUL сzsh
)) на несколько слов .Например, если
date
выходыFri 1 Nov 14:11:15 GMT 2013\n
(как это часто бывает в английской местности и в материковой части британского часового пояса), и в$IFS
настоящее время содержит:
, что будут разделить на 3 слово :Fri 1 Nov 14
,11
и15 GMT 2013
.zsh
): то есть, каждое слово в результате расщепления выше ищется подстановочными символы (*
,?
,[...]
хотя некоторые оболочки имеют более), а также расширен список имен файлов , которые соответствуют этим моделям. Например, если выходdate
является?%? 33 */*/* UVC 3432
(как это часто бывает в венерианской локалей и UVC часовой пояс), и$IFS
это значение по умолчанию), то , что расширяется до всех не скрытым 3 символов имен файлов в текущем каталоге , чей средний символ%
,33
, все не скрытые файлы во всех не скрытых подкаталогах всех не скрытых подкаталогов текущего каталога,UVC
и3432
.Поэтому:
$IFS
символы, на которые вы хотите разделить слова.set +f
чтобы отключить его.Одиночные кавычки заключают в кавычки все, так что символы обратного удара должны восприниматься буквально
Пример (использование
-x
упрощает просмотр происходящего):Если выходные данные содержат символы NUL, то поведение меняется от оболочки к оболочке: некоторые удаляют их, некоторые усекают вывод при первом символе NUL,
zsh
сохраняют их, но учтите, что в любом случае внешние команды не могут принимать аргументы, содержащие NULисточник
С помощью `date` вы получите вывод даты, разделенной на несколько слов, потому что разделение слов выполняется после подстановки команд.
С помощью `` date` 'вы получите вывод даты в виде одного слова / параметра, так как между двойными кавычками есть подстановка команды, но вывод не анализируется дальше. То же самое верно с расширением переменной как "$ i" в моем примере ниже.
С помощью `` date` 'вы получаете буквальный `date`, поскольку между одинарными кавычками нет подстановки команд.
Возможно, различия в 3 формах будут более заметны таким образом:
источник