Получение функциональных возможностей «гарантировать» / «наконец» в команде оболочки (не сценарии)?

Редактор dconf у меня работал, но я тоже видел это решение, и оно сработало легко.

https://github.com/Mayccoll/Gogh/blob/master/content/themes.md

У них есть несколько разных цветовых тем, перечисленных вместе с командной строкой для копирования и вставки в терминал. Тогда это просто работает.

Вот пример: https://github.com/Mayccoll/Gogh/blob/master/content/themes.md

Вам даже не нужно использовать sudo для изменения тема.

6
05.06.2017, 22:47
5 ответов

В zsh:

{mycmd.sh} always {rm -rf temp_files}

Часть always будет выполняться даже в случае ошибки, такой как глобус без совпадения или синтаксическая ошибка времени выполнения, которая выйти из скрипта.

3
27.01.2020, 20:20

Теперь я использую исключительно операторы && и || из если;то. Но иногда гораздо понятнее вернуться к «если; то». Это один из тех случаев, когда вам требуется решение командной строки.

Я бы переписал это так...

$ if mycmd.sh; then { success; actions; } else { fail; actions; } fi;  rm -rf temp_files/
  • mycmd.sh запускается и if использует его результат
  • Фигурные скобки гарантируют, что список нескольких команд внутри обрабатываются как один блок, и они повышают ясность. Пространства вокруг фигурных скобок и точки с запятой после каждой команды внутри, включая последние обязательны.
  • Поскольку rm происходит после fi, он будет выполняться безоговорочно.
0
27.01.2020, 20:20
mycmd.sh && { rm -r temp_files;  true; } || { rm -r temp_files; false; }
1
27.01.2020, 20:20

Если вы ищете копию некоторых языков' попробуйте { } finally { }, есть и другой способ: использование trap, встроенного в bash и других оболочках POSIXy (см. help trap).

#!/bin/bash

# exit with this by default, if it is not set later
exit_code=0  

# the cleanup function will be the exit point
cleanup () {
  # ignore stderr from rm incase the hook is called twice
  rm -rf "temp_files/" &> /dev/null  
  # exit(code)
  exit $exit_code
}

# register the cleanup function for all these signal types (see link below)
trap cleanup EXIT ERR INT TERM

# run your other script
mycmd.sh

# set the exit_code with the real result, used when cleanup is called
exit_code=$?

Прочтите об аргументах команды trap.

Обратите внимание, что cleanup вызывается:

  • если этот скрипт отправляет SIGINT или SIGTERM или если нажата CTRL-C (SIGINT)
  • если этот скрипт нормально завершается с 0
  • если mycmd.sh завершается с ненулевым статусом (возможно, не то, что вы хотите - удалить ERR из аргументов прерывания, чтобы отключить )
8
27.01.2020, 20:20

Новые строки в скрипте почти всегда эквивалентны точкам с запятой:

mycmd.sh; ret=$?; rm -rf temp_files; exit $ret

В ответ на правку:

Кроме того, вы также можете использовать ловушку и подоболочка:

( trap 'rm -rf temp_files' EXIT; mycmd.sh )
14
27.01.2020, 20:20

Теги

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