Вместо этого вы можете использовать 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
«Лучший способ» сильно зависит от того, сколько усилий вы считаете максимальными. Одним из довольно простых способов является использование&&
-подключенных списков команд для небольшой модификации вашего примера. Вы можете использовать любую арифметическую тестовую конструкцию 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
после такие «защищенные» строки (на тот случай, если вы используете код выхода таким образом ).
Если мы определим переменную 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)
. Я думаю, что ошибка -слишком опасна для серьезного использования.
Если вам нужно сокращение, вы можете использовать псевдоним. Они больше похожи на замену текста, чем на обычные расширения, поэтому синтаксические конструкции могут вставляться через них. Просто нужно явно включить в сценариях 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?"