Условное комментирование опасной оболочки

Вместо этого вы можете использовать sort. Опция-u-подавляла дубликаты в выводе :

.
$ sort -u file*.hosts | tee hosts.hosts
0.0.0.0 site1.com
0.0.0.0 site2.com
0.0.0.0 site3.com

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

С таким же успехом вы могли бы просто использовать перенаправление вместо этого:

$ sort -u file*.hosts > hosts.hosts
1
02.11.2021, 07:57
3 ответа

«Лучший способ» сильно зависит от того, сколько усилий вы считаете максимальными. Одним из довольно простых способов является использование&&-подключенных списков команд для небольшой модификации вашего примера. Вы можете использовать любую арифметическую тестовую конструкцию Bash:

#!/bin/bash
safemode=1

(( ! safemode )) && run dangerous code 1
uncritical code
(( ! safemode )) && run dangerous code 2

или оператор на основе обычной строки -

#!/bin/bash
safemode=on

[[ $safemode = "off" ]] && run dangerous code 1
uncritical code
[[ $safemode = "off" ]] && run dangerous code 2

Это просто довольно короткая -ручная запись того, что вы уже сделали. :Проверка [[... ]]даст false, если safemodeне равно off, поэтому выполнение списка команд будет остановитесь на &&.

Возможно, стоит отметить, что в случае списка цепочек команд&&-код выхода будет кодом последней выполненной команды, поэтому, если установлено safemode, $?будет 1после такие «защищенные» строки (на тот случай, если вы используете код выхода таким образом ).

2
03.11.2021, 07:45

Если мы определим переменную safemodeкак одну из двух команд trueили false, то мы можем использовать это как префикс:

#!/bin/sh
safemode=true

safe_mode_off() { safemode=false }

"$safemode" || run dangerous code 1
uncritical code
"$safemode" || run dangerous code 2

Думаю, обычно мы устанавливаем переменную из нашей обработки опций, поэтому true/ falseтак же просто, как on/ off.


Мы могли бы расширить это (, хотя я не думаю, что мы обязательно должны )просто сделать опасные команды аргументами для false, вот так:

#!/bin/sh
risky=false

safe_mode_off() { risky= }

$risky run dangerous code 1
uncritical code
$risky run dangerous code 2

Однако в этом случае расширение по-прежнему будет иметь место в пределах аргументов -, например. $(dangerous subcommand)все равно будет выполняться, поэтому нам нужно изменить его на $($risky dangerous subcommand). Я думаю, что ошибка -слишком опасна для серьезного использования.

2
16.11.2021, 10:33

Если вам нужно сокращение, вы можете использовать псевдоним. Они больше похожи на замену текста, чем на обычные расширения, поэтому синтаксические конструкции могут вставляться через них. Просто нужно явно включить в сценариях Bash, и вы хотите, чтобы случайно не включить нежелательные псевдонимы.

#!/bin/bash
unalias -a
shopt -s expand_aliases

# default safe
alias risky='[ "$riskymode" = enabled ] &&'
riskymode=
if [ "$1" = risky ]; then
        riskymode=enabled
fi

echo this is normal
risky echo this is risky

Но обратите внимание, что по-прежнему существует предостережение о том, что условие по-прежнему является частью&&-списка, так что это:

risky echo try something risky || echo oopsie it failed

запустит echo oopsie, даже если рискованный режим отключен.

Но можно было:

risky ( echo try something risky || echo oopsie it failed )

или даже

risky if ! echo another risky attempt; then echo another failure; fi

(вы можете поместить составную команду в список&&-)


Мы могли бы даже сделать псевдоним строки комментарием:

#!/bin/bash
unalias -a
shopt -s expand_aliases
alias risky='#'
if [ "$1" = risky ]; then
        alias risky=''
fi
risky echo something risky, again || echo "does it fail now?"

, но тогда, конечно, он просто проигнорирует первую строку , поэтому вторая строка снова будет запущена в «безопасном» режиме:

risky echo something even more risky ||
    echo "_now_ does it fail?"
2
16.11.2021, 11:04

Теги

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