Saya ingin melengkapi jawaban ravi :
Perilaku ini khusus untuk Ubuntu (dan mungkin sebagian besar distro), karena ~/.bashrc
file 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 source
warisi akan mewarisi properti ini.
eval
retas
Saya menemukan peretasan jelek untuk menyelesaikan Ubuntu secara khusus, menggunakan eval
bukannya source
:
eval "$(cat ~/.bashrc | tail -n +10)"
Itu hanya melompati beberapa baris pertama dan mengevaluasi sisanya ~/.bashrc
sehingga 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 bash
formulir tetapi dengan cara ini Anda tidak dapat memulai shell dengan argumen .
- Dengan menggunakan
-i
rangkaian konsekuensinya sendiri, di antaranya, program akan meminta interaksi pengguna dan ini biasanya tidak dimaksudkan untuk skrip, misalnya, menginstal deb
paket mungkin menghentikan skrip saat dpkg configure
diminta .
- Awalnya saya mencoba menggunakan
set -i
dan set +i
mematikan fitur di tempat saya membutuhkannya, tetapi ini tidak berhasil .