Причина в конструкции XFS. Если вы углубитесь в ее историю, вы увидите, что SGI была известна своими рабочими станциями, предназначенными для редактирования аудио и видео. SGI создала XFS для очень хорошей обработки огромных файлов (xxx МБ и более ). Они добавили использование экстентов(с обычным размером около 1 МБ )для повышения производительности при обработке больших файлов. Вы можете найти более подробную информацию здесь
То, что вы сделали, не работает и в bash, за исключением очень простых примеров.
$ testif 'hello world = hello world'
bash: [: too many arguments
false
$ testif '"hello world" = "hello world"'
bash: [: too many arguments
false
$ testif '* = *'
(usually false with an error message, but it depends on the files in the current directory)
Даже ваш простой пример не работает в zsh, потому что в отличие от других sh -, таких как оболочки, в zsh $1
на самом деле означает «взять значение первого аргумента» (почти :, если расширение приводит к пустому слову, оно полностью удаляется ). В bash и других sh -, подобных оболочкам, $1
означает «взять значение первого аргумента, разбить его на слова и обработать каждое слово как шаблон глобуса», что почти никогда не является тем, что вам нужно.
В синтаксисе команды test
/single -скобки можно передать условие как отдельные аргументы.
testif () {
if [ "$@" ]; then echo true; else echo false; fi
}
Это работает (с ограничениями команды [
, т.е. нет операторов &&
и ||
.
$ testif '*' = '*'
true
$ testif hello = hello
true
$ testif 'hello world' = 'hello world'
true
$ testif 0 = 00
false
$ testif 0 -eq 00
true
Тем не менее, редко бывает веская причина для [
условия. Вы могли бы также передать всю команду. Это не только позволяет вам передавать другие виды условий (, например. grep …
или if systemctl is-active …
), но если вам нужно больше, чем простая команда, вы можете определить вспомогательную функцию.
testif () {
if "$@"; then echo "true"; else echo "false"; fi
}
$ testif [ 'hello world' = 'hello world' ]
true
$ testif grep -q : /etc/passwd
true
Другой подход заключается в передаче всей команды в виде одной строки и использовании eval
внутри функции.
testif () {
if eval "$1"; then echo true; else echo false; fi
}
$ testif '[ "hello world" = "hello world" ]'
true
$ testif '[ "hello world" = "h*" ]'
false
$ testif '[[ "hello world" = "h*" ]]'
false
$ testif '[[ "hello world" = h* ]]'
true