Bash, есть ли способ получить ту же функцию, что и двойное цитирование переменной, без использования двойных кавычек - PullRequest
1 голос
/ 12 июля 2020

Я хотел бы получить тот же эффект, что и vim "$p", но без использования двойных кавычек, где $p - это путь со специальными символами и пробелами.

например, что-то желаемое DOUBLE_QUOTE функция: vim $(DOUBLE_QUOTE $p)

После множества повторных поисков я попробовал:

  • vim $(echo ${p@Q})

... все безуспешно (я получаю цитаты в пути)

Фон: причина в том, что строка передается между несколькими скриптами пакетной обработки окна и программами, и я провел выходные, пытаясь избежать двойных кавычек через несколько слоев, но безуспешно.

1 Ответ

4 голосов
/ 12 июля 2020

После выполнения

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...