Bash: Экранирование двойных кавычек при подстановке команды $()

Если вы вызываете эмулятор терминала из командной строки -в другом эмуляторе терминала, он (обычно )создает новое окно, а затем возвращается к командной строке в первом эмуляторе терминала. Исходя из этого, что-то вроде:

#!/bin/bash
cd python
<whatever-terminal-emulator> --command gnuplot

Должно получиться то, что вы хотите (хотя --commandопция может отличаться, если вы используете действительно простой эмулятор терминала, такой как xterm (для них, вы обычно просто опускаете --commandопция ).

1
26.06.2019, 10:30
1 ответ

Я предполагаю, что вы знаете, что echo "$(somecommand)"можно просто заменить на somecommand, так как echoне требуется для вывода вывода команды, и что вы используете эту конструкцию только в качестве примера.

Команда echo $(ls "$DIR")«работает», потому что ls "$DIR"выводит abcfile, который выводит echo.

Заключение подстановки команды в данном случае ничего не изменит. Строку abcfileне нужно заключать в кавычки, если вы не измените $IFS, чтобы включить символы, присутствующие в этом имени файла (, см. почему ниже ).

Однако,рассмотреть

A B C/
|-- A*
`-- abcfile

Сейчас:

$ echo "$(ls "$DIR")"
A*
abcfile
$ echo $(ls "$DIR")
A B C abcfile

Вы заметите, что в последнем выводе имя файла A*расширено как шаблон подстановки имени файла, который соответствует имени каталога A B C. Вы также заметите, что мы потеряли новую строку, которую выводил ls.

Новая строка была потеряна, потому что оболочка выполнила разбиение слова -на вывод без кавычек ls, разбив его на слова по пробелам, табуляциям и символам новой строки (содержимое по умолчанию $IFS).

Имя каталога A B Cбыло вставлено, потому что слова, сгенерированные при разбиении слов, подверглись генерации имени файла(подстановке ).

Если бы имя нового файла было A* A*, имя каталога было бы вставлено дважды:

A B C/
|-- A* A*
`-- abcfile
$ echo $(ls "$DIR")
A B C A B C abcfile

Связанные:

2
27.01.2020, 23:17

Теги

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