Значение переменной не разрешается в аргументе, и инструкция эха не может быть напечатана

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

0
11.06.2020, 17:16
2 ответа

Я думаю, что проблемы, с которыми вы столкнулись, в целом могут быть связаны с обработкой специальных символов и цитирования в вашем сценарии оболочки.

В качестве вводного замечания :вы не упомянули, как ваш дочерний скрипт получает доступ к функциям в основном скрипте, но я предполагаю, что вы делаете что-то вроде

~$ 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}', включая кавычки. позже в процессе ).

0
28.04.2021, 23:24
if [[ "$File_name" =~ ^[[:alnum:]][[$_."#&']] ]]; then

Вы используете "и ', из-за чего выражение неполное и не выполняется.

2
28.04.2021, 23:24

Теги

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