[
команда является обычной командой. Хотя большинство оболочек обеспечивает его как встроенное для эффективности, это соблюдает нормальные синтаксические правила оболочки. [
точно эквивалентно test
, за исключением того, что [
требует a ]
как его последний аргумент и test
не делает.
Двойные скобки [[ … ]]
специальный синтаксис. Они были представлены в ksh (спустя несколько лет после этого [
) потому что [
может быть неприятным для использования правильно и [[
позволяет некоторым новым хорошим дополнениям ту оболочку использования специальные символы. Например, можно записать
[[ $x = foo && $y = bar ]]
потому что все условное выражение анализируется оболочкой, тогда как [ $x = foo && $y = bar ]
был бы сначала разделен на две команды [ $x = foo
и $y = bar ]
разделенный &&
оператор. Столь же двойные скобки включают вещи как синтаксис сопоставления с образцом, например. [[ $x == a* ]]
протестировать ли значение x
запускается с a
; в одиночных скобках это расширилось бы a*
к списку файлов, имена которых запускаются с a
в текущем каталоге. Двойные скобки были сначала представлены в ksh и только доступны в ksh, ударе и zsh.
В одиночных скобках необходимо использовать двойные кавычки вокруг подстановок переменных, как в большинстве других мест, потому что они - просто аргументы команде (который, оказывается, [
команда). В удваивают скобки, Вам не нужны двойные кавычки, потому что оболочка не делает разделения слова или globbing: это анализирует условное выражение, не команду.
Исключение, хотя [[ $var1 = "$var2" ]]
где Вам нужны кавычки, если Вы хотите сделать сравнение байта к строке байтов, иначе, $var2
был бы шаблон для соответствия $var1
против.
Одна вещь Вы не можете сделать с [[ … ]]
использование переменная как оператор. Например, это совершенно законно (но редко полезно):
if [ -n "$reverse_sort" ]; then op=-gt; else op=-lt; fi
…
if [ "$x" "$op" "$y" ]; then …
В Вашем примере
dir="/home/mazimi/VirtualBox VMs"
if [ -d ${dir} ]; then …
команда в if
[
с этими 4 аргументами -d
, /home/mazimi/VirtualBox
, VMs
и ]
. Синтаксические анализы оболочки -d /home/mazimi/VirtualBox
и затем не знает, что сделать с VMs
. Необходимо было бы предотвратить разделение слова на ${dir}
получить правильно построенную команду.
Вообще говоря, всегда используйте двойные кавычки вокруг переменной и управляйте заменами, если Вы не знаете, что хотите выполнить разделение слова и globbing на результате. Основные места, где безопасно не использовать двойные кавычки:
foo=$bar
(но обратите внимание необходимость в двойных кавычках в export "foo=$bar"
или в присваивании массива как array=("$a" "$b")
);case
оператор: case $foo in …
;=
или ==
оператор (если Вы действительно не хотите сопоставления с образцом): [[ $x = "$y" ]]
.Во всех них это корректно для использования двойных кавычек, таким образом, Вы могли бы также пропустить усовершенствованные правила и использовать кавычки все время.
Символьные ссылки являются по существу просто указателями на другой файл, Вы не можете указать на что-то вне chroot, потому что он ищет файл с тем именем (/var/www
, который не существует в chroot). Hardlinks, с другой стороны, являются указателями на inode. По сути, если Вы хотите сделать это, необходимо использовать жесткую ссылку путем исключения -s
. Однако Вы не можете жесткая ссылка каталог (кроме .
и ..
) в Linux по ряду причин (основной, являющийся, что те файловые системы являются DAG).
Возможно, лучший способ состоял бы в том, чтобы использовать связывание, монтируются. Попробуйте это:
mount --bind /var/www /home/username/www
ln: '/var/www': hard link not allowed for directory
– Doc 14.11.2012, 17:53/foo/a.txt
и/foo/bar/b.txt
затем Вы могли сделатьmkdir -p ./chroot/foo/; mkdir -p ./chroot/foo/bar; ln /foo/a.txt ./chroot/foo/a.txt; ln /foo/bar/b.txt ./chroot/foo/bar/b.txt
? Или это все еще не работало бы по некоторым причинам? (Очевидно, это - что-то, что Вы записали бы сценарию, чтобы сделать, вместо того, чтобы делать вручную). – shadowtalker 02.11.2017, 22:39none
режим наряду сbind
опция: serverfault.com/questions/613179 / … – Yvan 08.02.2018, 18:48