вернуть CCSM прозрачность

Единственными случаями rm $oldfile могут быть ошибки, когда ваше имя файла содержит любой символ IFS (пробел, табуляция, новая строка) или любой символ глоба (*, ?, []). [!d0 ]

Если присутствует какой-либо символ из IFS, оболочка будет выполнять разбиение слов и на основе наличия расширений имени шаблонов глобусов при расширении переменной.

Так, например, если имя файла foo bar.old., переменная oldfile будет содержать foo bar.old..

Когда вы это делаете:

rm $oldfile

оболочка сначала разбивает разложение oldfile на пробел на два слова, foo и bar.old.. Таким образом, команда становится:

rm foo bar.old.

, что, очевидно, приведет к неожиданному результату. Кстати, если у вас есть какие-либо операторы globbing (*, ?, []) в расширении, то расширение пути также будет выполнено.

Вам нужно процитировать переменные, чтобы получить желаемый результат:

rm "$oldfile"

Теперь не будет разбито слово или расширение пути, поэтому вы должны получить желаемый результат, то есть желаемый файл будет удален. Если какое-либо имя файла начинается с -, тогда выполните:

rm -- "$oldfile"

Вы можете спросить, почему нам не нужно указывать переменные при использовании внутри [[ , причина в том, что [[ является ключевым словом bash и обрабатывает переменное расширение, внутренне сохраняющее литерал расширения.

Теперь пару точек:

[d12 ] Вы должны перенаправить STDERR (exec 2>errorfile) перед командой rm, иначе [[ -s errorfile ]] тест даст ложные срабатывания. Вы использовали [ -s $errorfile ], вы используете переменное расширение $errorfile, которое было бы присвоено NUL errorfile переменная не определена нигде. Возможно, вы имели в виду только [ -s errorfile ], на основе перенаправления STDERR. Если переменная errorfile определена при использовании [ -s $errorfile ], она снова захлестнет вышеупомянутые случаи IFS и заглохнет, поскольку в отличие от [[, [ f35] не обрабатывается внутри bash. В более поздней части скрипта вы пытаетесь cp уже удаленный файл (опять же без цитирования переменной), это не имеет никакого смысла, вы должны проверить, что патрон и внести необходимые исправления на основе вашей цели.
1
задан 11 February 2012 в 13:36

0 ответов

Другие вопросы по тегам:

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