Вам нужно заключить переменную в кавычки
testpath="/path/to/first dir/dir/" && printf '%q' "$testpath"
Используя ваши примеры, когда вы выполняете ls b*
, оболочка расширяет b*
до bar barbados
, так что вы фактически запускаете ls bar barbados
. Когда ls
имеет несколько аргументов, если какой-либо из них является каталогом, он печатает имя, за которым следует список файлов в каталоге.
Когда вы выполняете ls f*
, оболочка расширяет f*
до foo
, так что вы фактически запускаете ls foo
. Когда ls
имеет один аргумент, если этот аргумент является каталогом, печатает список файлов в каталоге (без имени каталога ).
Не существует того, что я бы назвал "хорошим" способом заставить ls
делать то, что вы хотите (по крайней мере, я не знаю, кто-то другой может знать лучше ). Одним из «не очень хороших» способов было бы включить дополнительный аргумент, который, как вы знаете, никогда не будет существовать, а затем отфильтровать вывод ошибок, связанных с этим несуществующим файлом. Я отмечу для протокола, что синтаксический анализ вывода ls
— плохая идея, но я дам вам это, если это поможет:
$ function dls() {
if [[ $# -eq 0 ]]; then
ls
else
ls ${@} this-file-does-not-exist-anywhere 2> >(grep -v this-file-does-not-exist-anywhere)
fi
}
$ dls
foo
$ dls f*
foo:
1 2
Подобные действия могут иметь непредвиденные последствия (например, вы не сможете перенаправлять стандартные сообщения об ошибках, как обычно ).
Используйте параметр -al
, который большинство людей использует каждый раз. ls
не будет этого делать, пока вы не добавите косую черту в конце имени каталога. Другой параметр -d
, тогда он никак не упадет.
Если вы хотите, чтобы он был постоянным, поместите следующее в свой .bashrc
в вашем домашнем каталоге:
alias lsd='ls -d' ;
Вы можете использовать команду lsd
в будущем.
Возможным обходным решением может быть функция-оболочка:
dls() {
if [ "$#" -eq 1 ] && [ -d "$1" ]; then
printf '%s:\n' "$1"
fi
ls -- "$@"
}
Если эти два условия верны, выведите имя каталога перед перечислением его содержимого.
% dls f*
foo:
1 2
В некоторых реализациях printf
вы можете заменить %s
на %q
, чтобы имя каталога заключалось в кавычки аналогично тому, как это делают последние версии GNU ls
, когда оно содержит пробелы или другие специальные символы.