rm
жестко запрограммирован для «интерактивного» запроса (ожидания ввода пользователем )файлов, защищенных от записи. есть два способа запретить rm
спрашивать:
rm -rf somedir
и
rm -r --interactive=never somedir
(оба работают и без -r
при удалении файлов вместо каталогов)
объяснение:
-f
заставляет rm
«игнорировать несуществующие файлы и аргументы, никогда не предлагать».
--interactive=never
делает то, что говорит :никогда не будет интерактивным. другими словами :никогда не подсказывают.
разница между -f
и --interactive=never
заключается в этой части :"игнорировать несуществующие файлы и аргументы".
сравнить:
$ rm -rf nonexistingname
$ echo $?
0
и
$ rm -r --interactive=never nonexistingname
rm: cannot remove 'nonexistingname': No such file or directory
$ echo $?
1
разница в основном интересна при написании сценариев, в которых вы никогда не хотите rm
быть интерактивными, но все же хотите обрабатывать ошибки.
сводка :по использованию командной строки rm -rf
. в сценариях используйте rm -r --interactive=never
.
ответ на поставленный вопрос ("Как избежать необходимости выдавать "y" несколько раз при удалении защищенного файла" )см.https://askubuntu.com/questions/338857/automatically-enter-input-in-command-line/338860#338860
Я думаю, что проблемы, с которыми вы столкнулись, в целом могут быть связаны с обработкой специальных символов и цитирования в вашем сценарии оболочки.
В качестве вводного замечания :вы не упомянули, как ваш дочерний скрипт получает доступ к функциям в основном скрипте, но я предполагаю, что вы делаете что-то вроде
~$ source main_script.sh
~$ export now=$( date '+%Y%m%d' )
~$ Function_1 'abc_${now}'
Если я это сделаю, моя оболочка сообщит о нескольких синтаксических ошибках, и сценарий не будет работать. Я предполагаю, что вы также используете bash
, так как вы использовали этот тег, и я признаю, что удивлен, что вы не столкнулись с этими ошибками. Вы все еще можете рассмотреть возможность использования такого инструмента, как shellcheck
, доступного в Интернете или в качестве программного пакета во многих дистрибутивах Linux, для проверки ваших сценариев оболочки --, это, безусловно, помогает мне находить опечатки и подобно.
Теперь о проблемах, с которыми вы столкнулись.
Вы утверждаете, что первый вывод echo
никогда не происходит. Я думаю, это связано с построением вашего регулярного выражения и использованием специальных символов:
[[ "$File_name" =~ ^[[:alnum:]][[$_."#&']] ]]
вы используете список символов [$_."#&']
со специальными для оболочки символами :Например, $_
, вероятно, будет интерпретироваться как последний аргумент оболочки , а двойные -кавычки "
интерпретируются оболочкой как начало буквальной строки, которая заканчивается в следующей строке первым "
вашей команды echo
. Это должно вызвать синтаксическую ошибку, потому что оболочка пытается интерпретировать ваше выходное сообщение как одобрение оболочки; это определенно так, когда я пытаюсь это сделать. Вы должны обязательно экранировать такие символы, чтобы предотвратить нежелательную интерпретацию командной оболочки, как в \$_\"\#\&\'
. [[... ]]
для списка символов. Однако это синтаксически не определено. То, что определяется , представляет собой список символов [... ]
, состоящий только из одного класса символов , например. [:alnum:]
.Конструкция такого типа действительно будет записана как [[:alnum:]]
, как вы уже сделали в первой части вашего регулярного выражения. Поэтому вам следует опустить «внешнюю» пару квадратных скобок. ^
. Поэтому я предполагаю, что вы хотите разрешить имена файлов, которые начинаются с обычной буквы или цифры, но затем могут содержать все упомянутые вами специальные символы. Однако ваше регулярное выражение допускает только имена файлов, начинающиеся с одного буквенно-цифрового символа, а затем , требующие одного из специальных символов в качестве второго символа. Если вы хотите убедиться, что любое их количество разрешено в дополнение к буквенно-цифровым символам, вместо этого вы должны написать что-то вроде ^[[:alnum:]][[:alnum:]\$_.\"\#\&\']*$
. Вторая часть представляет собой список символов [... ]
, содержащий класс символов [:alnum:]
и , а также специальные символы $
, _
, .
, "
, #
, &
и '
, ноль или более раз(*
)до конца строки($
). Этот последний символ привязки гарантирует, что полное имя файла состоит только из разрешенных вами символов. Следующее замечание касается того, что переменная ${now}
не разрешена (, то есть "расширена" в терминологии оболочки ).
Как уже отмечалось в нескольких комментариях, раскрытие параметров внутри одинарных кавычек не происходит '... '
. Если вместо этого вы используете двойные кавычки "... "
, расширение переменной будет работать.
Кажется, вы уверены, что вам нужны одинарные кавычки. Если это действительно так, вы мало что можете сделать; в этом случае вам может понадобиться дополнительно объяснить , почему вам нужны одинарные кавычки (, то есть чего вы хотите достичь, или нужна ли дальнейшая обработка выражения 'abc_${now}'
, включая кавычки. позже в процессе ).
if [[ "$File_name" =~ ^[[:alnum:]][[$_."#&']] ]]; then
Вы используете "
и '
, из-за чего выражение неполное и не выполняется.