Вы также можете использовать printfкоманду вместо echo:
printf '%s\n' *
printfпревосходит echoв этой ситуации то, echoчто не использует «двойную черту» ( --) для обозначения конца списка аргументов (в некоторых системах, включая Ubuntu 14.04, на котором я тестировал):
llama@llama:~$ mkdir -p Misc/unix210948
llama@llama:~$ cd !$
cd Misc/unix210948
llama@llama:~/Misc/unix210948$ touch -- -n
llama@llama:~/Misc/unix210948$ ls
-n
llama@llama:~/Misc/unix210948$ echo *
llama@llama:~/Misc/unix210948$ echo -- *
-- -n
llama@llama:~/Misc/unix210948$ printf '%s\n' *
-n
В этом случае вы не можете достичь желаемого результата с echo(так как вызываемый файл -nинтерпретируется как опция, а двойная черта не работает, поэтому вы должны использовать printf).
Обратите внимание, что вы всегда должны использовать строку формата, подобную приведенной выше, при работе с неизвестными данными printf, поскольку в противном случае вы можете получить неожиданные результаты (спасибо @ G-Man за то, что указал на это в комментариях!):
llama@llama:~/Misc/unix210948$ rm ./-n
llama@llama:~/Misc/unix210948$ touch '\n'
llama@llama:~/Misc/unix210948$ ls
\n
llama@llama:~/Misc/unix210948$ printf -- *
llama@llama:~/Misc/unix210948$ printf '%s\n' *
\n
Вызываемый файл \nинтерпретируется как перевод строки printf. Чтобы избежать этого, мы используем форматирующую строку для printf( %s) и передаем ей имена файлов (которые расширяются с помощью глобализации, как и раньше).
Это printfрешение + форматирование строки может обрабатывать самые разные имена файлов (а также обрабатывать «скрытые» файлы, то есть те, которые начинаются с ., так же, как ls):
llama@llama:~/Misc/unix210948$ rm ./*
zsh: sure you want to delete all the files in /home/llama/Misc/unix210948/. [yn]? y
llama@llama:~/Misc/unix210948$ touch -- '-n' '\n' 'name with spaces' '.hidden'
llama@llama:~/Misc/unix210948$ ls
-n \n name with spaces
llama@llama:~/Misc/unix210948$ printf '%s\n' *
-n
\n
name with spaces
Если вы printfподдерживаете %q, вы также можете использовать это ( printf '%q\n' *). Это будет экранировать пробелы, символы новой строки и т. Д., Если в ваших именах файлов есть какие-то странные символы. (Спасибо @muru в чате за указание на это !)
libc*soили с твоимld-linux*so