Saya ingin melengkapi jawaban ravi :
Perilaku ini khusus untuk Ubuntu (dan mungkin sebagian besar distro), karena ~/.bashrcfile default Anda dimulai dengan korsleting, Ubuntu 18.04, misalnya:
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
Itu akan menghentikan evaluasi file jika berjalan di shell non-interaktif, yang merupakan kasus skrip Anda karena semua skrip dijalankan di shell non-interaktif , dan selanjutnya setiap file yang Anda sourcewarisi akan mewarisi properti ini.
eval retas
Saya menemukan peretasan jelek untuk menyelesaikan Ubuntu secara khusus, menggunakan evalbukannya source:
eval "$(cat ~/.bashrc | tail -n +10)"
Itu hanya melompati beberapa baris pertama dan mengevaluasi sisanya ~/.bashrcsehingga sisanya dievaluasi dan memodifikasi eksekusi saat ini.
Ketahuilah bahwa ini adalah angka ajaib dan mungkin tidak berfungsi di seluruh versi Ubuntu; tetapi mungkin solusi yang bagus jika Anda membuat skrip untuk sistem yang lebih atau kurang dikenal.
Solusi yang lebih bagus mungkin melibatkan penggunaan regex untuk menargetkan bit spesifik yang menghentikan evaluasi.
Alternatif Shebang
Alternatif lain yang mungkin bekerja lebih baik dalam beberapa skenario adalah memaksa skrip untuk berjalan di shell interaktif dengan menambahkan bendera di shebang :
#!/bin/bash -i
Waspadai beberapa hal:
- Ini adalah praktik yang lebih baik untuk menggunakan
#!/usr/bin/env bashformulir tetapi dengan cara ini Anda tidak dapat memulai shell dengan argumen .
- Dengan menggunakan
-irangkaian konsekuensinya sendiri, di antaranya, program akan meminta interaksi pengguna dan ini biasanya tidak dimaksudkan untuk skrip, misalnya, menginstal debpaket mungkin menghentikan skrip saat dpkg configurediminta .
- Awalnya saya mencoba menggunakan
set -idan set +imematikan fitur di tempat saya membutuhkannya, tetapi ini tidak berhasil .