Еще одно решение, которое, как мне кажется, заключается в автопереходе
, а z
- это fasd
.
Он отслеживает, какие каталоги вы посещаете, и z dir-name
перейдет в каталог с именем dir-name
, который вы используете чаще всего. Он также имеет некоторые функции для часто используемых файлов.
Вы можете клонировать его со страницы: https://github.com/clvv/fasd
Установка выполняется просто, клонируйте, выполните установку, а затем измените свой . bashrc
(или .zshrc
и т. д.).
Наверное, я не RTFM. Это можно сделать так:
q_mid=\'\\\'\'
foo_esc="'${foo//\'/$q_mid}'"
Тогда echo "$foo_esc"
дает ожидаемое'bar'\''baz'
Как я на самом деле использую это с функцией:
function esc_var {
local mid_q=\'\\\'\'
printf '%s' "'${1//\'/$mid_q}'"
}
...
foo_esc="`esc_var "$foo"`"
Изменение этого для использования printf
, встроенного -из решения Дежа:
function esc_vars {
printf ' %q' "$@" | cut -b 2-
}
Принимая во внимание предупреждения Стефана о несовместимости между различными версиями bash относительно одинарных кавычек внутри расширений с двойными -кавычками, функция доказательства маркера -становится:
esc_vars() {
local fmt
fmt='%s'
local v
while [ $# -gt 0 ]; do
v=\'${1//\'/\'\\\'\'}\'
printf "$fmt" "$v"
fmt=' %s'
shift
done
}
Bash предоставляет встроенную printf
спецификацию формата %q
, которая выполняет экранирование оболочки даже в более старых (<4.0 )версиях Bash:
printf '[%q]\n' "Ne'er do well"
# Prints [Ne\'er\ do\ well]
printf '[%q]\n' 'Sneaky injection $( whoami ) `ls /root`'
# Prints [Sneaky\ injection\ \$\(\ whoami\ \)\ \`ls\ /root\`]
Этот трюк также можно использовать для возврата массивов данных из функции:
function getData()
{
printf '%q ' "He'll say hi" 'or `whoami`' 'and then $( byebye )'
}
declare -a DATA="( $( getData ) )"
printf 'DATA: [%q]\n' "${DATA[@]}"
# Prints:
# DATA: [He\'ll\ say\ hi]
# DATA: [or\ \`whoami\`]
# DATA: [and\ then\ \$\(\ byebye\ \)]
Обратите внимание, что встроенная программа Bash printf
отличается от утилиты printf
, которая поставляется в комплекте с большинством Unix -подобных операционных систем. Если по какой-то причине команда printf
вызывает утилиту вместо встроенной, вы всегда можете вместо нее выполнить builtin printf
.
Существует несколько решений для цитирования значения переменной:
псевдоним
В большинстве оболочек (, где доступен псевдоним )(, за исключением csh, tcsh и, возможно, других подобных csh):
$ alias qux=bar\'baz
$ alias qux
qux='bar'\''baz'
Да, это работает во многихsh
-таких оболочках, как dash или ash.
установить
Также в большинстве оболочек снова (, а не csh):
$ qux=bar\'baz
$ set | grep '^qux='
qux='bar'\''baz'
набрано
В некоторых оболочках (ksh, bash и zsh по крайней мере):
$ qux=bar\'baz
$ typeset -p qux
typeset qux='bar'\''baz' # this is zsh, quoting style may
# be different for other shells.
экспорт
Сначала сделай:
export qux=bar\'baz
Затем используйте:
кшexport -p | grep 'qux='
башexport -p | grep 'qux='
зшexport -p qux
цитата
башecho "${qux@Q}"
zshecho "${(qq)qux}"
#можно использовать от одного до четырех q.
В PHP вы можете использовать функцию escapeshellarg , которая преобразует общую строку в строку аргумента bash.