Я использую скрипт bash в терминале , поэтому при выходе
set -o errexit
убивает мой терминал, который крайне раздражает, потому что я должен закрыть терминал, открыть другой и сбросить некоторые переменные.
Пока, используя
command || return
линии, в сценарии, делает именно то, что я хочу
set -o errexit
делать ... Но я хочу, чтобы это было сделано для всего сценария; не только одна строка / команда
У меня есть файл, полный команд для настройки сайта, и я бы предпочел не делать команду || возвращение
для каждой строки в файле
Есть ли другая опция set или что-то еще, что будет просто «возвращаться» вместо выхода из терминала?
- Просто для ясности , я хотел бы убить скрипт и оставить терминал в том же состоянии, в котором нажатие Ctrl + C для уничтожения службы, запущенной в терминале. command || return
делает это Но я не хочу касаться || return
каждой строки в файле. Поэтому я ищу что-то похожее set -o errexit
, что не приводит к закрытию терминала
--- Примечание: создание тупого скрипта с двумя строками (super.sh):
create_path=~/Desktop/site_builder/create.sh
source $create_path blah
И поместив set -o errexit
в начало create.sh,
работает именно так, как я этого ожидаю. Однако действительно глупо создавать файл с двумя строками, просто для вызова другого скрипта bash, вместо того, чтобы просто вызывать его из терминала. Ugghhh
вот несколько примеров:
в супер.ш
#!/bin/bash
create_path=~/Desktop/site_builder/create.sh
source $create_path blah
в create.sh
#!/bin/bash
set -o errexit
#line below this is a line that fails and will cause the script to stop and return to the terminal as expected
sed "s/@@SITE_NAME@@/$dirname"
~/Desktop/site_builder/template_files/base.html > ~/Desktop/$dirname/templates/base.html # a line with a stupid error
в терминале:
$ bash super.sh
вывод, как ожидалось:
my-mac$
Это работает. Какое досадное решение.
Я хочу , в идеале, выполнить то, что находится в глупом файле super.sh из терминала, а не в файле super.sh: D, без отключения терминала от меня. Вот что происходит с тем, что я пытаюсь сделать:
терминальная команда:
my-mac$ source $create_path blah
в create.sh у меня еще есть set -o errexit
Вот вывод на терминал
sed: 1: "s/@@SITE_NAME@@/blah": unterminated substitute in regular expression
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.
[Process completed]
А потом терминал заморожен. Ctrl + C не работает, как и Ctrl + D
Если вместо этого set -o errexit
, если я просто использую command || return
операторы везде в файле create.sh, то получаю именно то, что хочу, при выполнении строк в supser.sh непосредственно на терминале (вместо вызова super.sh из терминала). Но это тоже не практическое решение.
Примечание: мне понравился ответ @terdon о создании дочерней оболочки, поэтому я просто создал подпрограмму с помощью сценария, а не терминала, как он показал в своем ответе, используя фигурные скобки ( )
, вокруг всего сценария. Его ответ тоже работает
source $file_path argument
Сценарий выполняется в той же оболочке, из которой я его вызвал (что source
, как мне сказали ... и действует так, как это) command || return
операторы находятся в файле, который я выполняю в терминале