Ketika saya menggunakan exit
perintah dalam skrip shell, skrip akan mengakhiri terminal (prompt). Apakah ada cara untuk mengakhiri skrip dan kemudian tinggal di terminal?
Skrip saya run.sh
diharapkan untuk dieksekusi dengan bersumber langsung, atau bersumber dari skrip lain.
EDIT: Untuk lebih spesifik, ada dua skrip run2.sh
sebagai
...
. run.sh
echo "place A"
...
dan run.sh
sebagai
...
exit
...
ketika saya menjalankannya . run2.sh
, dan jika masuk exit
codeline run.sh
, saya ingin berhenti di terminal dan tinggal di sana. Tetapi menggunakan exit
, seluruh terminal ditutup.
PS: Saya sudah mencoba menggunakan return
, tetapi echo
codeline masih akan dieksekusi ....
exit 0
untuk menghentikan skrip setelah sukses, ketika Anda menjalankan skrip Anda ex:./test.sh
Anda akan melihat output tetapi konsol Anda akan tetap terbuka.shell
perintah, yang sebenarnya membuka terminal shell. Namun pengalaman saya sendiri adalah bahwa ini tidak terjadiexit
. Keluar biasanya mengembalikan kontrol ke skrip induk.Jawaban:
"Masalahnya" sebenarnya adalah Anda mencari dan tidak menjalankan skrip. Saat Anda mencari file, isinya akan dieksekusi di shell saat ini, alih-alih menghasilkan subshell. Jadi semuanya, termasuk keluar, akan mempengaruhi shell saat ini.
Alih-alih menggunakan
exit
, Anda akan ingin menggunakanreturn
.sumber
runs.sh
@ruakh memiliki jawaban yang lebih baik untuk pertanyaan ini.sh <script>
ataubash <script>
jika seseorang ingin menjalankan skrip dan mengakhiri di beberapa titikIya; Anda bisa menggunakan
return
bukanexit
. Tujuan utamanya adalah untuk kembali dari fungsi shell, tetapi jika Anda menggunakannya dalamsource
skrip -d, ia kembali dari skrip itu.Seperti §4.1 "Bourne Shell Builtins" dari Bash Reference Manual menyatakan:
sumber
return
HANYA dapat digunakan dari suatu fungsi. Jika Anda menggunakanreturn
dan menjalankannya sebagai skrip shell (misalnyash run.sh
), bash akan melaporkan kesalahan -return: can only
kembali 'dari suatu fungsi atau skrip bersumber`return
tidak akan berfungsi jika skrip dijalankan sebagai skrip shell dan tidak dijalankan oleh. (atausource
). BTW, di mana saya dapat menemukan dokumen tentangsource -d
?Alih-alih menjalankan skrip menggunakan
. run2.sh
, Anda dapat menjalankannya menggunakansh run2.sh
ataubash run2.sh
Sub-shell baru akan dimulai, untuk menjalankan skrip kemudian, itu akan ditutup pada akhir skrip meninggalkan shell lainnya dibuka.
sumber
sh "." run2.sh
?Anda dapat menambahkan perintah keluar tambahan setelah pernyataan kembali / perintah sehingga berfungsi untuk keduanya, menjalankan skrip dari baris perintah dan sumber dari terminal.
Contoh kode keluar dalam skrip:
Baris dengan
exit
perintah tidak akan dipanggil ketika Anda sumber skrip setelahreturn
perintah.Saat Anda menjalankan skrip,
return
perintah memberikan kesalahan. Jadi, kami menekan pesan kesalahan dengan meneruskannya ke/dev/null
.sumber
Sebenarnya, saya pikir Anda mungkin bingung dengan cara Anda shoult
run a script
.Jika Anda menggunakan
sh
untuk menjalankan skrip, katakansh ./run2.sh
,, bahkan jika skrip tertanam diakhiriexit
, jendela terminal Anda akan tetap ada.Namun jika Anda menggunakan
.
atausource
, jendela terminal Anda akan keluar / ditutup juga ketika subskrip berakhir.untuk detail lebih lanjut, silakan lihat Apa perbedaan antara menggunakan
sh
dansource
?sumber
Ini seperti Anda meletakkan fungsi run di dalam skrip run2.sh. Anda menggunakan kode keluar di dalam menjalankan saat sumber file run2.sh Anda di bash tty. Jika fungsi run memberikan kekuatannya untuk keluar dari skrip Anda dan berikan run2.sh kekuatannya untuk keluar dari terminator. Kemudian karena fungsi jalankan memiliki kekuatan untuk keluar dari teminator Anda.
Bagaimanapun, saya menyetujui dengan Kaz itu masalah desain.
sumber
Saya memiliki masalah yang sama dan dari jawaban di atas dan dari apa yang saya pahami apa yang akhirnya berhasil bagi saya adalah:
Memiliki garis shebang yang memanggil skrip yang dimaksud, misalnya,
#!/bin/bash
gunakanbash
untuk mengeksekusi skripSaya punya skrip dengan kedua jenis shebang. Karena itu, menggunakan
sh
atau.
tidak dapat diandalkan, karena menyebabkan kesalahan eksekusi (seperti ketika skrip bail out telah berjalan tidak lengkap)Karena itu, jawabannya adalah
(chmod +x file.sh)
Meminta secara langsung tanpa
sh
atau.
(./myscript.sh)
Semoga ini bisa membantu seseorang dengan pertanyaan atau masalah serupa.
sumber
Saya pikir ini terjadi karena Anda menjalankannya pada mode sumber dengan titik
Anda harus menjalankannya dalam subkulit:
'sumber' http://ss64.com/bash/source.html
sumber
. myscript.sh
berfungsi. Paling-paling, Anda mungkin perlu./myscript.sh
.Benar bahwa skrip bersumber vs dieksekusi menggunakan
return
vs.exit
untuk menjaga sesi yang sama tetap terbuka, seperti yang telah dicatat orang lain.Berikut tip terkait, jika Anda menginginkan skrip yang membuat sesi tetap terbuka, terlepas dari apakah itu bersumber atau tidak.
Contoh berikut dapat dijalankan secara langsung seperti
foo.sh
atau bersumber seperti. foo.sh
/source foo.sh
. Apa pun itu, sesi akan tetap terbuka setelah "keluar". The$@
string berlalu begitu bahwa fungsi memiliki akses ke argumen script luar itu.Hasil terminal:
Ini dapat berguna untuk dengan cepat menguji perubahan skrip dalam satu terminal sambil menjaga sekelompok kode memo di bawah utama
exit
/return
saat Anda bekerja. Bisa juga membuat kode lebih portabel dalam arti (jika Anda memiliki banyak skrip yang mungkin atau mungkin tidak dipanggil dengan cara yang berbeda), meskipun jauh lebih kikuk untuk digunakanreturn
danexit
jika perlu.sumber
jika emulator terminal Anda tidak memiliki,
-hold
Anda dapat membersihkan skrip bersumber dan menahan terminal dengan:jika tidak, Anda dapat menggunakan
$TERM -hold -e script
sumber
Pastikan juga untuk kembali dengan nilai pengembalian yang diharapkan. Lain jika Anda menggunakan keluar ketika Anda akan menemukan keluar itu akan keluar dari shell dasar Anda karena sumber tidak membuat proses lain (contoh).
sumber
Untuk menulis naskah yang aman untuk dijalankan baik sebagai shell script atau bersumber sebagai file rc, script dapat memeriksa dan membandingkan
$0
dan$BASH_SOURCE
dan menentukan apakahexit
dapat digunakan dengan aman.Berikut ini cuplikan kode singkat untuk itu
sumber
1) keluar 0 akan keluar dari skrip jika berhasil.
2) keluar 1 akan keluar dari skrip jika gagal.
Anda dapat mencoba keduanya di atas berdasarkan ur req.
sumber