Saya memiliki file yang dapat dieksekusi mpiexec
, yang path lengkapnya adalah ~/petsc-3.2-p6/petsc-arch/bin/mpiexec
. Karena saya ingin menjalankan perintah ini di direktori yang berbeda (tanpa harus mengetik ulang seluruh path), saya menyiapkan alias di .bashrc
file rumah saya :
alias petsc="~/petsc-3.2-p6/petsc-arch/bin/mpiexec"
yang memungkinkan saya untuk mengeksekusi mpiexec
file ini di command prompt dengan mudah dengan mengetik:
petsc myexecutable
Saya mencoba menulis file skrip shell, bernama script
, menggunakan alias baru saya petsc
sebagai perintah. Setelah memberikan skrip shell saya izin yang sesuai (menggunakan chmod
), saya mencoba menjalankan skrip. Namun, itu memberi saya kesalahan berikut:
./script: line 1: petsc: command not found
Saya tahu bahwa saya hanya bisa menulis path lengkap ke mpiexec
file, tetapi sulit untuk menulis path lengkap setiap kali saya ingin menulis skrip baru. Apakah ada cara agar saya dapat menggunakan alias saya petsc
di dalam file skrip? Apakah ada cara saya dapat mengedit .bashrc
atau .bash_profile
membuat ini terjadi?
.bash_aliases
? Juga bagaimana dengan aliasing jalur absolut dan bukan jalur relatif sepertialias petsc='/home/user/petsc-3.2-p6/petsc-arch/bin/mpiexec'
Jawaban:
Dalam skrip shell Anda gunakan path lengkap daripada alias.
Dalam skrip shell Anda, tetapkan sintaks variabel yang berbeda
Gunakan fungsi dalam skrip Anda. Mungkin lebih baik jika
petsc
rumitSumber alias Anda
Anda mungkin tidak ingin sumber Anda
.bashrc
, jadi, IMO, salah satu dari 3 pertama akan lebih baik.sumber
shopt -s expand_aliases
skrip yang sama.|
. Di sini, gunakanshopt -s expand_aliases
& alias lokal, mis.alias myalias='echo abc|rev'
- membutuhkan jeda baris sebelum digunakan (lihat ALIAS diman bash
). Butir 4: File bersumber dapat mencegah eksekusi non-interaktif, yaitu dalam skrip. Cari lebih awalexit
ataureturn
, misalnya[ -z "$PS1" ] && return
(memeriksa apakah prompt utama tidak disetel yang menunjukkan shell non-interaktif) atau mungkin ada checki
in$-
($-
berisi opsi shell,i
berarti interaktif). Lihatman bash
variabel-variabel itu.Alias tidak digunakan lagi karena fungsi shell. Dari
bash
halaman manual:Untuk membuat fungsi, dan ekspor ke subkulit, masukkan yang berikut ini di
~/.bashrc
:Kemudian Anda dapat dengan bebas memanggil perintah dari skrip Anda.
sumber
"$@"
hanya untuk menangani argumen.Fungsi dan alias Shell terbatas pada shell dan tidak berfungsi di skrip shell yang dieksekusi. Alternatif untuk kasus Anda:
(jika Anda tidak repot-repot menggunakannya,
mpiexec
bukanpetsc
) Tambahkan$HOME/petsc-3.2-p6/petsc-arch/bin
kePATH
variabel Anda . Ini dapat dilakukan dengan mengedit~/.profile
dan menambahkan:Login ulang untuk menerapkan perubahan ini
Buat direktori
~/bin
danbuat skrip wrapper dengan nama yang
petsc
mengandung:jika program memungkinkan, Anda dapat melewati shellscript dan membuat symlink menggunakan perintah:
sumber
Di bash 4 Anda dapat menggunakan variabel khusus:
$BASH_ALIASES
.Sebagai contoh:
Atau tentukan sebagai variabel kemudian gunakan substitusi perintah atau
eval
.Jadi misalnya, alih-alih mendefinisikan alias seperti:
mendefinisikannya sebagai:
sebagai gantinya. Kemudian jalankan dengan:
atau:
sumber
${BASH_ALIASES[alias]}
ini pilihan yang bagus. Kalau tidak, saya harus mengedit banyak baris .bash_aliases saya untuk menerapkan hal-hal lain. Terima kasih.Anda bisa memaksa bash untuk mengeksekusi skrip Anda sebagai shell interaktif dengan flag -i. Ini akan memberi tahu file .bashrc Anda untuk menentukan alias dan fungsi lainnya.
Contoh:
Info lebih lanjut:
sumber
.bashrc
juga dibaca selama eksekusi perintah SSH non-interaktif (itu sebabnya ia memiliki cek untuk interaktivitas di atas)Jadi jawaban sebenarnya untuk pertanyaan ini, bagi mereka yang ingin menggunakan alias aktual dalam skrip shell alih-alih alternatifnya, adalah:
Adapun mengapa saya ingin melakukan ini: Karena keadaan yang tidak biasa, saya perlu menipu Dockerfile untuk berpikir itu adalah skrip shell.
sumber
Di
.bash_aliases
:Atau masukkan fungsi
.bashrc
. Biasanya.bashrc
hanya pengaturan konfigurasibash
yang disimpan.Di Terminal:
source .bash_aliases
petsc arg(s)
Keuntungan: Anda tidak perlu
export -f petsc
di.bash_aliases
. Alias sudah usang tetapi menggunakan.bash_aliases
untuk fungsi tidak masalah.sumber
Jadi jika Anda memiliki file yang dipanggil
script.sh
dengan perintah Anda yang termasuk menggunakan alias, cukup ketik:sumber
.
atausource
buiiltin menyebabkan shell saat ini untuk menjalankan semua perintah di dalamnya. Jika ekspansi alias akan terjadi di shell di mana.
atausource
dijalankan, itu terjadi. Namun, penting untuk menyadari bahwa metode ini hanya kadang-kadang berguna, karena sering kali seseorang perlu atau ingin menjalankan skrip di shell sendiri, dengan lingkungannya sendiri. Skrip shell yang ditulis dengan tujuan dieksekusi dengan cara yang biasa tidak seharusnya diambil dari sumbernya - skrip tersebut seringkali tidak berfungsi dengan baik.(EDIT: fungsi yang dihapus karena saya salah membaca panggilan mpiexec.)
Jika satu-satunya yang Anda butuhkan adalah kurang mengetik, mengapa Anda tidak memasukkan folder ke dalam $ PATH? Atau buat symlink ke mpiexec dari beberapa folder dalam $ PATH? Atau (favorit saya) memasukkan alias dalam skrip yang Anda sumber dalam skrip panggilan?
sumber
"$@"
.