#zsh
#zsh
Вопрос:
Я искал значение флагов, как -a
в if
заявлениях zsh, например.
if [[ -a file.txt ]]; do
# do something
fi
и я нашел это
-файл
true, если файл существует.
-e файл
true, если файл существует.
В чем разница между -a
и -e
? И если их нет, почему они оба существуют?
Комментарии:
1. Я думаю, что разницы нет;
-a
возможно, это была опция, используемая более старой оболочкой и поддерживаемаяzsh
для совместимости со сценариями, и теперь она сохраняется для обратной совместимости со старыми версиямиzsh
самой себя.2. Должен ли этот вопрос касаться суперпользователя? Я не думал об этом, пока не опубликовал его
3. Это серая область; использование и сценарии сильно перекрываются, когда дело доходит до оболочек.
4. @chepner Вы также можете опубликовать это в качестве ответа.
Ответ №1:
POSIX проливает некоторый свет на это.
tl; dr: Традиционно использовался Ksh -a
, и несколько других снарядов последовали его примеру. Вместо этого POSIX позаимствовал -e
у Csh, чтобы избежать путаницы. Теперь многие оболочки поддерживают оба.
-e
Основной, обладающий аналогичной функциональностью, предоставляемой оболочкой C, был добавлен, потому что он предоставляет единственный способ для сценария оболочки узнать, существует ли файл, не пытаясь открыть файл. Поскольку реализациям разрешено добавлять дополнительные типы файлов, переносимый скрипт не может использовать:test -b foo -o -c foo -o -d foo -o -f foo -o -p foo
чтобы узнать, является ли foo существующим файлом. В исторических системах BSD существование файла может быть определено с помощью:
test -f foo -o -d foo
но не было простого способа определить, что существующий файл является обычным файлом. В одном из ранних предложений использовалось
-a
основное значение KornShell (с тем же значением), но оно было изменено на-e
, потому что были опасения по поводу высокой вероятности того, что люди путают-a
основное значение с-a
двоичным оператором.
Комментарии:
1. И по иронии судьбы,
-a
оно никогда не было обязательным и теперь считается устаревшим 🙂-e
в любом случае, кажется, гораздо лучшее имя.