Как я могу проверить надежность обработки файла моего сценария оболочки?

11

Я написал сценарий оболочки, который обрабатывает некоторые «обычные» имена файлов, но я прочитал Почему мой сценарий оболочки задыхается от пробелов или других специальных символов? и почему вы не должны анализировать вывод ls, и я бы хотел, чтобы он был более устойчивым и обрабатывал любые допустимые имена файлов (и / или имена каталогов). Как мне создать тестовую площадку из файлов и каталогов для запуска моего скрипта?

Джефф Шаллер
источник

Ответы:

11

Создайте отдельный каталог для воспроизведения (в основном для упрощения очистки позже); это использует значение, $TMPDIRесли оно установлено, в противном случае /tmp:

mkdir "${TMPDIR-/tmp}/testing"
cd "${TMPDIR-/tmp}/testing"

Создайте отдельные файлы, но они будут похожи друг на друга из-за пробелов (пробел, табуляция, перевод строки, возврат каретки, возврат на одну позицию):

touch -- a b 'a ' 'b ' 'a b' 'a  b' $'a\bb'
touch -- a$'\xe2\x80\x82'b a$'\xe2\x80\x83'b a$'\t'b a$'\n'b a$'\r'b

Благодарю за вышесказанное Патрику . Два шестнадцатеричных кода - это разделители пространства UTF-8, известные как орехи и баранина ; «в двунаправленном контексте он действует как белое пространство и (не) не отражается. Глиф (ы) может, при определенных обстоятельствах, быть перепутан с 20 другими символами».

Создайте простой файл и файл, который будет расширяться до первого, если он будет рассматриваться как глобус:

touch -- x '[x]' 

Кредит на выше Wumpus Q. Wumbley .

В том же духе:

touch -- 'a?b' 'a*b'

Кредит за вышеупомянутое dave_thompson_085 в комментариях здесь.

touch -- foo\`echo\ malicious\`bar

Отдайте должное вышеупомянутому godlygeek .

Имя файла, которое будет расширено до чего-то другого (и, возможно, произвольного выполнения!), Если оно будет оценено в контексте оболочки:

touch '$( echo boom )'

Использование:

touch -- single\'quote double\"quote back\\slash

отлавливать попытки поместить имя файла в кавычки без экранирования кавычек.

touch -- -a -b -c -r -R - a=x

Кредит для выше Stéphane Chazelas .

Создайте именованный канал и символическую ссылку (для создания файлов, которые не являются «обычными»):

mkfifo fifo
ln -s a alink

Создайте подкаталоги, в именах которых есть разные пробелы, а также файлы токенов внутри них:

mkdir subdir "subdir 1" "subdir 2" "subdir 3 " subdir$'\n'4
touch subdir/file0 "subdir 1"/file1 "subdir 2"/file2 "subdir 3 "/file3 subdir$'\n'4/file4

Создайте только имена файлов, содержащие *(возможно, проблематично удалить), имя файла, состоящее только из (обычного!) Пробела, мертвой символической ссылки, символической ссылки, которая зацикливается на себя, и подкаталога со ссылкой на родительский каталог:

touch -- '*' '**' '***' ' '

ln -s /does/not/exist dead

ln -s loop loop

mkdir subdir_with_link
(cd subdir_with_link && ln -s .. parent)

Больше разных имен файлов. Последние два являются Unicode для «дробной черты» и «косой черты».

touch -- '(' '!' '!!'  $'\xe2\x81\x84' $'\xe2\x88\x95'

Идеи от Скотта :

touch -- '-' '--' ';' '&' '|' '<' '>' '$' ')' '{' '}' = \\ '!' '#' '{a,b}'

Персонажи, которые безвредны в некоторых местах, но опасны в других:

touch $'X\xa0Y' # non-breaking space in iso8859-1 which is considered
                # "blank" and "space" in some locales

touch $'\xa3\x5c' $'\xa3\x60' # α and ε in BIG5 or BIG5-HKSCS charset, but
                              # �\ and �` in ASCII

Символы, которые сортируются одинаково в некоторых локалях:

touch   # sorts the same in GNU locales, order non-deterministic.

Файлы, которые экранируют .[!.]* *глобус (иногда используются для расширения как скрытых, так и не скрытых файлов):

touch ..foo ...
Jeff Schaller
источник
ирония комментария "комментарий" отвлекает; Вы хотите добавить объяснения того, что делают различные команды?
Джефф Шаллер
1
да, пожалуйста, опишите тестовые случаи, большинство из которых вы создали, очевидны, а некоторые из них похожи на те, которые в нем похожи на символы Unicode, - нет.
Муру
1
Я бы добавил a?bи a*b(цитирую конечно). @muru: байтовые последовательности E2 80 82/83 являются кодировкой UTF-8 U + 2002 EN SPACE и U + 2003 EM SPACE
dave_thompson_085
Некоторые злые гении на работе есть: -c
user207673
Может быть интересно поиграть, -и --, хотя, в зависимости от требований сценария, может быть невозможным получить к ним доступ без ведущего ./. И я удивлен , что так мало с не-Глоб оболочки специальные символы, как ;, &, |, <, >, $, (, ), {, }, =, \, !, и #- например, {a,b}.
Скотт