Saya menggunakan skrip (yang saya tidak memiliki akses tulis) yang membuat banyak alias untuk mengatur lingkungan. Saya ingin membuat fungsi bash untuk mengatur lingkungan saya, tetapi tampaknya alias tidak bertahan hidup ke fungsi tubuh.
Inilah contoh minimal:
# aliases.sh
alias fooAlias='echo "this will never work!"'
.
# .bashrc
function setupLotsOfThings() {
source aliases.sh
fooAlias
}
.
Sekarang, jika saya hanya sumber secara aliases.sh
interaktif, hal-hal berfungsi seperti yang diharapkan:
[mycomputer]~/ $ source aliases.sh
[mycomputer]~/ $ fooAlias
this will never work!
Namun, jika saya sebaliknya memanggil fungsi yang didefinisikan dalam .bashrc saya, itu tidak mengenali alias setelah sumber definisi:
[mycomputer]~/ $ setupLotsOfThings
-bash: fooAlias: command not found
Apa yang terjadi disini? Apakah ada sesuatu yang saya lewatkan tentang ruang lingkup alias
perintah ketika digunakan dalam suatu fungsi?
Sunting: Saya akan menambahkan beberapa detail di luar contoh minimal untuk menyinari apa yang saya coba capai.
Untuk pekerjaan saya, saya mengembangkan dan menjalankan banyak perangkat lunak pada sebuah cluster dan / atau grid. Saya memiliki beberapa proyek yang memerlukan lingkungan yang benar-benar berbeda, seperti versi gcc yang berbeda, rilis perangkat lunak tertentu, konfigurasi dan PATH data, dan berbagai variabel lingkungan. Administrator menyediakan skrip untuk mengatur berbagai hal, biasanya dengan mendefinisikan fungsi shell atau alias, yang memanggil fungsi lain atau alias atau menjalankan berbagai skrip. Bagi saya, ini kotak hitam.
Saya ingin mengatur berbagai lingkungan saya sendiri dengan satu perintah. Saat ini, saya melakukan sesuatu seperti:
[mycomputer]~/ $ source /some/environment/setup/script.sh
[mycomputer]~/ $ aliasToSetupSomeSoftwareVersion #this was defined in the above
[mycomputer]~/ $ anotherAliasForOtherSoftware
[mycomputer]~/ $ source /maybe/theres/another/script.sh
[mycomputer]~/ $ runSomeOtherSetup # this was defined in the new script
Perintah-perintah ini umumnya harus dijalankan secara berurutan. Ide saya pada dasarnya adalah hanya menyalin garis-garis di atas ke dalam blok fungsi, tetapi seperti contoh asli menunjukkan, itu tidak berfungsi. Penanganan alternatif lebih dari diterima!
setupLotsOfThings
, mereka hanya tidak tersedia untuk fungsi itu sendiri. Mereka bekerja o shell dari mana Anda memanggil fungsi. Lagi pula, jika fungsi Anda hanya sumber alias mengapa tidak hanya menggunakan alias? Sebagai contoh:alias setupstuff="source aliases.sh"
.Sebenarnya, alias Anda tersedia setelah fungsi dimuat! Anda dapat menggunakannya di shell interaktif Anda, atau di Anda
.bashrc
setelah menjalankan fungsi.Batasannya adalah bahwa alias dalam definisi fungsi diperluas ketika definisi fungsi dibaca, bukan ketika fungsi dievaluasi. Ini adalah batasan bash. Jadi ini akan berhasil:
Tapi bukan ini:
Jika Anda membutuhkan alias yang dapat digunakan di dalam fungsi-fungsi dan dapat didefinisikan setelah fungsi diuraikan, buatlah fungsinya sebagai gantinya. Ingatlah bahwa Anda dapat menggunakan
command
builtin untuk menjalankan perintah eksternal dari fungsi dengan nama yang sama.sumber