Что использовать rm -rf " `pwd `/folder вместо rm -rf./folder

Проблема заключалась во внутреннем кард-ридере, который, по-видимому, также был подключен через USB.
По-видимому, это связано с:https://bugzilla.kernel.org/show_bug.cgi?id=201997
Не выяснил, что такое "usb1". lsusbпо-прежнему показывает те же устройства, что и раньше.

0
08.07.2020, 21:19
1 ответ

rm -rf "`pwd`/folder" — это плохо, и вы не должны его использовать. Это плохо только из-за углового случая, но этот угловой случай может оказаться проблемой безопасности, ведущей к удалению неправильного каталога. В крайнем случае, если текущий каталог заканчивается символом новой строки :, подстановка команды удаляет завершающие символы новой строки, поэтому, если текущий каталог /some/where/strange⏎(, где ⏎ означает новую строку ), эта команда вместо этого удалит /some/where/strange..

Вариант rm -rf "$PWD/folder"не имеет недостатков по сравнению с использованием команды pwdи имеет преимущество, состоящее в том, что он не страдает от углового случая завершающего символа новой строки. Каждая оболочка Bourne/POSIX обновляет переменную PWDпосле каждого каталога -, изменяющего команду (cd, pushdи т. д. ), и она имеет то же значение, что и pwd, встроенный -в выводах команды.. (Внешняя команда pwdможет иметь другой вывод, но 1. pwdвызывает встроенную -, если она есть и она есть во всех обычных оболочках, и 2. нет никаких преимуществ в использовании внешней в любом случае командовать здесь.)

Однако

rm -rf "$PWD/folder"не имеет преимуществ перед rm -rf./folder. Его теоретический недостаток заключается в том, что rm -rf "$PWD/folder"может превысить максимальную длину командной строки, в то время как rm -rf./folderподходит. Однако максимальная длина командной строки почти всегда значительно больше, чем максимальная длина пути к файлу, поэтому почти всегда подходит команда с одним путем.

Использование "$PWD/$foo"вместо "$foo"имеет то преимущество, что оно гарантированно не начинается с тире, поэтому не будет выглядеть как опция . Это не проблема, если путь явно указан в скрипте, только если это переменная. И "./$foo"предлагает такую ​​же защиту. И "$PWD/$foo", и "./$foo"верны только тогда, когда $fooявляется относительным путем. Так что rm -rf "$PWD/$foo"не имеет преимущества перед rm -rf "./$foo". И, как показано выше, если задействовано много путей, использование более короткой относительной формы может помочь избежать ограничения длины командной строки.

Использование "$PWD/folder"имеет явное преимущество перед "./folder", если вы сохраняете его в переменной для последующего использования. :он сохраняет назначение одного и того же файла, даже если скрипт тем временем переходит в другой каталог. Хотя с rm -rf "./folder"все в порядке, для такого кода требуется абсолютный путь:

output_directory="$PWD/output"
# If interrupted, delete the partial output.
trap 'rm -rf "$output_directory"; exit 1' HUP INT TERM

do_stuff >"$output_directory/file1"
do_more_stuff >"$output_directory/file2"
cd "$output_directory"
further_stuff file1 file2 >file3

Если бы $output_directoryбыл относительным путем, код очистки мог бы работать до команды cdили после, но не одновременно.

5
18.03.2021, 23:21

Теги

Похожие вопросы