/ / Чому тестування з -f в bash повертає істину, коли до тесту не надаються аргументи? [дублікат] - bash, shell, ubuntu, scripting

Чому тестування з -f в bash повертає true, коли для тесту немає аргументів? [дублікат] - bash, оболонка, ubuntu, сценаріїв

У файлі сценарію у мене є такий фрагмент коду:

if [ -f $FILEPATH ] ; then
cp $FILEPATH ~/some/other/dir
fi

Тепер через помилку в цьому самому файлі сценарію деякі рядки над цим фрагментом коду змінна $ FILEPATH не отримує значення і не визначена, тому те, що дійсно виконується, це:

if [ -f ] ; then
cp $FILEPATH ~/some/other/dir
fi

У цій ситуації я б очікував цього тестуабо кинути помилку (тому що немає аргументу до -f), або повернути помилкове (тому що він шукає файл без імені), але тест повертає істину і вміст умови if виконується.

Мені цікаво, як Баш інтерпретує цей тест, щоб повернути правду в цьому сценарії. Що таке справжнє тест?

У Ubuntu я використовую bash версії 4.3.48

Відповіді:

2 для відповіді № 1

Це те, що POSIX поведінка для test команда:

Команда test, с

1 аргумент:

Вийдіть true (0), якщо $ 1 не є нульовим; в іншому випадку вийдіть помилково.

Отже test -f (або, що еквівалентно, [ -f ]) викликається одним ненульовим аргументом, тому він повертається true.