Можна використовувати .exec ./your-script
Термінальний емулятор, на зразок терміналу GNOME, закривається, коли вихідний процес, що працює всередині нього, - це звичайно оболонка.
Якщо ви вже перебуваєте в терміналі і єдине, що ви хочете зробити перед тим, як вийти з цього терміналу, - це запустити певний скрипт (або програму), то це означає, що вам більше не потрібна оболонка, яка працює в ньому. Таким чином, ви можете використовувати execвбудований оболонку, щоб змусити оболонку замінити себе процесом, створеним вашою командою.
- У випадку з вашим сценарієм, це ще один процес оболонки - так само, як створюється другий процес оболонки, коли ви запускаєте сценарій без
exec.
Синтаксис , наприклад, .exec commandexec ./your-script
exec: приклад
Наприклад, припустимо, що у мене є скрипт оболонки, який називається count, позначений виконуваним і розміщений у поточному каталозі. Це містить:
#!/usr/bin/env bash
for i in {5..1}; do echo $i; sleep 1; done
І в терміналі я запускаю:
exec ./count
Це друкує цифри 5, 4, 3, 2, і 1, по одному на кожну секунду, а потім вікно закривається термінал.
Якщо ви запускаєте це з чогось іншого, ніж перший запуск процесу у вашому терміналі - наприклад, якщо ви запустили bashперший, щоб запустити інший екземпляр оболонки - то це поверне вас до оболонки, яка створила цей процес, а не виходу з терміналу. (Цей застереження застосовується однаково до exitметодів, заснованих на основі.)
Можна використовувати ../your-script; exit
Якщо ви не хочете казати своїй оболонці замінювати себе новим процесом (через exec), ви можете сказати, щоб він тримався, але вийшов із себе відразу після завершення нового процесу.
Для цього запустіть свою команду та exitкоманду, розділену ;так, щоб їх можна було задати в одному рядку.
Синтаксис command; exit, наприклад, ../your-script; exit
command; exit vs. command && exit
Ви можете помітити , це виглядає так само, метод , запропонований в Kos ігрових і heemayl - х відповіді. Різниця полягає в тому, що:./your-script && exit
&&запускає другу команду лише в тому випадку, якщо перша команда повідомила, що це вдалося , повернувши вихідний нуль.
; виконує другу команду незалежно від того, чи не повідомила перша команда про успіх.
Кого ви хочете, залежить від конкретної ситуації. Якщо команда не працює, чи хочете, щоб оболонка виклику (і хостинг-термінал) залишалася в режимі очікування? Якщо так, використовуйте &&; якщо ні, використовуйте ;.
Є також command || exit, яка закриває оболонку виклику, лише якщо commandповідомила про помилку .