Это zsh
, мужчина, а неfish
.
В zsh
, как и в каждом Bourne -, подобном оболочке (, а также csh
), одинарные кавычки являются сильными, в них нет экранирования (, кроме как с помощью rcquotes
варианты, как , подсказанные @JdeBP , где zsh
эмулирует rc
кавычки¹ ). У вас не может быть одинарной кавычки внутри одной строки -в кавычках, вам нужно сначала закрыть строку с одинарными кавычками и ввести буквальную одинарную кавычку, используя другой механизм цитирования (, например \
или "
):
.
alias shopt='echo "You'\''re looking for setopt. This is Z shell, man, not Bash."'
Или:
alias shopt='echo "You'"'"'re looking for setopt. This is Z shell, man, not Bash."'
Хотя можно было бы и так:
alias shopt="echo \"You're looking for setopt. This is Z shell, man, not Bash.\""
("..."
являются более слабыми кавычками, внутри которых несколько символов, в том числе\
(используемые здесь для экранирования встроенного "
), по-прежнему являются специальными ).
Или:
alias shopt=$'echo "You\'re looking for setopt. This is Z shell, man, not Bash."'
($'...'
— это еще один вид кавычек из ksh93, где '
можно экранировать с помощью\'
).
(и кстати, вы также можете использовать стандартный set -o
вместо setopt
в zsh
. bash
по историческим причинам имеет два набора опций, один из которых вы устанавливаете с помощью set -o
другой с помощью shopt
; zsh
как и большинство других оболочек, имеет только один набор параметров ).
¹ В rc
, оболочке Plan9, также доступна версия для unix -, одинарные кавычки являются единственным механизмом цитирования(обратная косая черта и двойные кавычки там обычные символы ), единственный способ ввести буквальную одинарную кавычку -с ''
внутри одинарных кавычек, поэтому с zsh -o rcquotes
,ты мог бы сделать:
alias shopt='echo "You''re looking for setopt. This is Z shell, man, not Bash."'
В данном случае это «символьно-ориентированное устройство» (b означает блочно-ориентированное устройство )... Вот почему /dev/null в вашем примере так эффективен при перенаправлении, например, с
command 2> /dev/null
На самом деле это не разрешение, а «знак определения»
Это файл на основе символьного устройства. В Linux устройства, такие как аппаратное обеспечение, характеризуются двумя способами :
.Символьные устройства (c ), которые представляют собой устройства, которые передают данные в символах, также известных как байты или биты, такие как мыши, динамик и т. д.
Блочные устройства (b ), которые представляют собой устройства, которые передают данные в блоках данных, таких как USB, жесткие диски и т. д.
Эти типы файлов обычно можно найти в каталоге /dev, где хранятся файлы устройств, просто введите ls -lah , и вы увидите различные типы.
Если вы работаете с приличным дистрибутивом Linux, эту информацию (плюс больше, чем вам может понадобиться ), можно получить с помощью команды:
info ls
, который содержит этот небольшой фрагмент:
The file type is one of the following characters: - regular file b block special file c character special file C high performance ("contiguous data") file d directory D door (Solaris 2.5 and up) l symbolic link M off-line ("migrated") file (Cray DMF) n network special file (HP-UX) p FIFO (named pipe) P port (Solaris 10 and up) s socket ? some other file type