Почему спящий режим при запуске в сценарии оболочки игнорирует SIGINT?

Вы были близки с ниже, чтобы удалить пробелы (на самом деле вы заменяете подчеркиванием ), но вам нужно было использовать двойные кавычки вместо одинарных кавычек, что предотвратит расширение переменной.

Кроме того, вы также должны знать, что, поскольку вы не проверяете переменную Pна предмет того, является ли она каталогом или файлом, может потребоваться переименование файлов.

for P in *\ *;
do
    [ -d "$P" ] && mv "$P" "${P// /_}" || echo 'skipping, the'"$P"' is not a directory'
done

Вы также можете сделать следующее, чтобы удалить все пробелы/квадратные скобки:

find -maxdepth 1 -type d -name 'P*' -exec bash -c 'echo ${1} ${1//[][ ]}' bash {} \;
./P [001]./P001
./P [002]./P002
./P [003]./P003
7
31.05.2021, 08:55
1 ответ

В /bin/sleep 10 &завершение &заставляет оболочку работать sleepасинхронно. Управление заданиями по умолчанию отключено в сценарии. В Bash применяется следующее [выделено мной]:

Non-builtin commands started by Bash have signal handlers set to the values inherited by the shell from its parent. When job control is not in effect, asynchronous commands ignore SIGINT and SIGQUIT in addition to these inherited handlers.

Источник:Справочное руководство Bash .

И, соответственно, SIG_IGNсохраняется при вызове execv(), за возможным исключением SIGCHLD.

Signals set to the default action (SIG_DFL) in the calling process image shall be set to the default action in the new process image. Except for SIGCHLD, signals set to be ignored (SIG_IGN) by the calling process image shall be set to be ignored by the new process image. Signals set to be caught by the calling process image shall be set to the default action in the new process image (see <signal.h>).

Источник:Базовые спецификации Open Group, выпуск 7, издание 2018 г. .

10
28.07.2021, 11:27

Теги

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