Как предотвратить подстановку команд в командной строке?

Способ сделать это — вывести процесс на другой TTY. Чтобы узнать имя вашего текущего tty, просто введите tty. Это даст вам, например, /dev/pts/0. Затем вы можете запускать такие команды, как

tail -f /permanent.log > /dev/pts/0 &

С помощью &в конце вы отправляете процесс в фоновый режим, чтобы вы могли запускать больше команд. Для восстановления прока можно использовать команды jobsи fg.

2
31.07.2019, 17:39
3 ответа

Вы можете избежать обратных кавычек, используя обратную косую черту, как показано ниже:

echo "\`wc -l *\`"
1
27.01.2020, 21:49

Использовать одинарную -сильную кавычку:

printf '%s\n' '`wc -l *`'

И если вы хотите также включить одинарные кавычки в этот аргумент, переданный в printf, вам нужно будет использовать другие кавычки для самого ', например:

printf '%s\n' '`wc -l *` and a '"'"' character'

или:

printf '%s\n' '`wc -l *` and a '\'' character'

Другие альтернативы включают экранирование `с обратной косой чертой в двойных кавычках:

printf '%s\n' "\`wc -l *\` and a ' character"

Или `быть результатом некоторого расширения:

backtick='`'
printf '%s\n' "${backtick}wc -l *${backtick} and a ' character"

Также обратите внимание:

cat << 'EOF'
`wc -l *` and a ' character and a " character
EOF

для вывода произвольного текста, не беспокоясь о заключении в кавычки (обратите внимание на кавычки вокруг первогоEOF).

Вы также можете:

var=$(cat << 'EOF'
echo '`wc -l *`'
EOF
)

Что с помощью ksh93или mkshвы можете оптимизировать до:

var=$(<<'EOF'
echo '`wc -l *`'
EOF
)

(также работает в zsh, но по-прежнему запускает catв подоболочке там ), чтобы $varбуквально содержал echo '`wc -l *`'.

В оболочке fishвы можете встроить 'в '...'с помощью\':

printf '%s\n' '`wc -l *` and a \' character'

но все равно `там не особо, так что:

printf '%s\n' "`wc -l *` and a ' character"

тоже подойдет.

В rc, es или zsh -o rcquotesвы можете вставить 'в '...'с помощью'':

printf '%s\n' '`wc -l *` and a '' character'

См. Как использовать специальный символ вместо обычного? для более подробной информации.

11
27.01.2020, 21:49

Чтобы экранировать любую произвольную последовательность символов, чтобы не обрабатывать специальные символы и не выполнять подстановку:

  1. Заменить все 'на'\''
  2. Заключите результирующую строку в одинарные кавычки.

Например:

`wc -l 'my file.txt'`

Становится

'`wc -l '\''my file.txt'\''`'

Обратите внимание, что если строка начинается или заканчивается на ', вы получаете ''в начале/конце, который ничего не делает и может быть удален, но допустимо оставить его там (, например. чтобы строка -экранировала функцию простой ).

0
27.01.2020, 21:49

Теги

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