После выполнения
IFS=
Вы можете использовать
vim $p
В противном случае нет.
При значении по умолчанию IFS
, bash
разделит значение $p
на последовательности пробелов, табуляции и / или перевода строки. Это сделает невозможным отправить a␠␠b
(два пробела в середине) на DOUBLE_QUOTE
, а DOUBLE_QUOTE
не сможет отличить guish a␠b
(пробелы посередине) от a␉b
(табуляция посередине).
Кроме того, значение, возвращаемое DOUBLE_QUOTE
, также будет подвержено этому разделению.
Таким образом,
vim $( DOUBLE_QUOTE $p )
будет иметь должно быть
vim "$( DOUBLE_QUOTE "$p" )"
для работы со значением по умолчанию IFS
.
Если, с другой стороны, вы пытаетесь сгенерировать команды оболочки, вы можете обратиться за помощью к этому вопросу .
Например,
printf '%s\n' "$( quote vim "$p" )"
выходы
'vim' 'a b'
задано
p='a b'
и
# quote() - Creates a shell literal
# Usage: printf '%s\n' "$( quote "..." "..." "..." )"
quote() {
local prefix=''
local p
for p in "$@" ; do
printf "$prefix"\'
printf %s "$p" | sed "s/'/'\\\\''/g"
printf \'
prefix=' '
done
}