Я шукаю скрипт bash в терміналі , тому виходжу з помилки з
set -o errexit
вбиває мій термінал, який НАЙКРАЙНО ДУЖЕ, тому що я повинен закрити термінал, відкрити ще один і скинути деякі змінні.
Поки що, використовуючи
command || return
рядки, за сценарієм, роблять саме те, що я хочу
set -o errexit
робити ... Але я хочу, щоб це було зроблено для всього сценарію; не лише один рядок / команда
У мене є файл, повний команд для налаштування сайту, і я краще не виконую команду || повернення
для кожного окремого рядка у файлі
Чи є інший варіант встановлення чи щось інше, що просто "повернеться" замість виходу з терміналу?
- Просто для наочності я хотів би вбити сценарій і залишити термінал у тому ж стані, що натискання клавіші 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, а не просто викликати його з терміналу. Угххх
ось кілька прикладів:
в супер.ш
#!/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
у файлі, який я