Dalam ~/.bashrc
file saya ada dua definisi:
commandA
, yang merupakan alias ke jalur yang lebih panjangcommandB
, yang merupakan alias untuk skrip Bash
Saya ingin memproses file yang sama dengan dua perintah ini, jadi saya menulis skrip Bash berikut:
#!/bin/bash
for file in "$@"
do
commandA $file
commandB $file
done
Bahkan setelah keluar dari sesi saya dan masuk kembali, Bash meminta saya dengan command not found
kesalahan untuk kedua perintah ketika saya menjalankan skrip ini.
Apa yang saya lakukan salah?
source ~/.bashrc
.Jawaban:
Pertama-tama, seperti yang dikatakan ddeimeke, alias secara default tidak diperluas di shell yang tidak interaktif.
Kedua,
.bashrc
tidak dibaca oleh cangkang non-interaktif kecuali jika Anda mengaturBASH_ENV
variabel lingkungan.Tetapi yang paling penting: jangan lakukan itu! Silahkan? Suatu hari Anda akan memindahkan script itu ke suatu tempat di mana alias yang diperlukan tidak diatur dan itu akan rusak lagi.
Alih-alih mengatur dan menggunakan variabel lingkungan sebagai pintasan dalam skrip Anda:
sumber
alias
kasus penggunaan biasa . Misalnyaalias mv="mv -v --backup=numbered"
.$CMDA
/$CMDB
... Terlepas dari variabel huruf besar yang dicadangkan untuk bash sendiri di bash, dan itu memang berfungsi, bahwa kurangnya tanda kutip membuat saya benar-benar gelisah ... Terima kasih.gizmo
tidak di jalan atau ada perintah dengan nama yang sama tetapi prioritas yang lebih tinggi. kalau tidak Anda bisa mengatur sederhanaCMDA
ke datarangizmo
di tempat pertama.Jika Anda melihat ke halaman manual bash, Anda menemukan:
Jadi letakkan a
dalam skrip Anda.
Pastikan untuk mencari file alias Anda setelah mengatur ini di skrip Anda.
sumber
shopt -s expand_aliases source ~/.bash_aliases
berfungsi dengan baik untuk saya. Seringkali ada bentuk deteksi shell interaktif di .bashrc seperti ini:# If not running interactively, don't do anything [ -z "$PS1" ] && return
@Zaid, Mungkin Anda ingin memeriksa itu di file yang Anda gunakan.shopt -s expand_aliases
tidak harus pergi sebelum definisi alias tetapi sebelum menggunakan alias. Menambahkan ke @FrankSchubert: Deteksi shell interaktif juga dapat dilakukan dengan menggunakan$-
yang berisi opsi untuk shell, khususnyai
jika shell bersifat interaktif.~/.bash_aliases
mungkin bergantung pada hal-hal lain yang sebelumnya dimuat pada shell interaktif ... Hal terdekat yang saya temukan adalah mengubah hashbang Anda menjadi#!/bin/bash -li
Masih tidak sempurna. Idealnya Anda harus menggunakan fungsi dan bukan alias.Alias tidak dapat diekspor sehingga tidak tersedia dalam skrip shell yang tidak didefinisikan. Dengan kata lain, jika Anda mendefinisikannya di
~/.bashrc
mereka tidak tersedia untukyour_script.sh
(kecuali Anda sumber~/.bashrc
dalam skrip, yang saya tidak akan merekomendasikan tetapi ada cara untuk melakukan ini dengan benar).Namun, fungsi dapat diekspor dan akan tersedia untuk shell skrip yang dijalankan dari lingkungan di mana mereka didefinisikan. Ini bisa dilakukan dengan menempatkan ini di bashrc Anda:
Seperti yang dikatakan dalam manual Bash, "Untuk hampir semua tujuan, fungsi shell lebih disukai daripada alias."
sumber
alias commandA=...
dengancommandA() { ... }
ituexport commandA
dan Anda mendapatkan perilaku yang identik dengan alias. Jadi ini cukup banyak alternatif yang identik dengan alias sejauh yang saya tahu itu sangat bagus dalam skrip bashalias b=bash
membuatnya mudah dilakukanb -c "echo test | grep test"
yang akan sulit dilakukan dalam fungsi.b () { bash "$@"; }
lalub -c "echo test | grep test"
Ini
i
untuk interaktif dan sumberbash
profil Anda untuk Anda.sumber
Saya menemukan kadang-kadang skrip bash juga tidak mengenali ekspor. Namun, mengubahnya menjadi
bekerja untukku.
sumber