Saya ingin menjalankan alias di dalam bash -c
konstruk.
The bash
pengguna mengatakan:
Alias tidak diperluas ketika shell tidak interaktif, kecuali jika
expand_aliases
opsi shell diatur menggunakanshopt
Dalam contoh ini, mengapa alias hi
tidak ditemukan saat pengaturan expand_aliases
secara eksplisit?
% bash -O expand_aliases -c "alias hi='echo hello'; alias; shopt expand_aliases; hi"
alias hi='echo hello'
expand_aliases on
bash: hi: command not found
Saya sedang berlari GNU bash, version 5.0.0(1)-release (x86_64-pc-linux-gnu)
.
Konteks: Saya ingin dapat menjalankan alias pada prioritas siaga, misalnya skrip yang berisi:
#!/bin/bash
exec chrt -i 0 nice -n 19 ionice -c 3 bash -c ". ~/.config/bash/aliases; shopt -s expand_aliases; $(shell-quote "$@")"
Saya ingin menghindari menggunakan bash -i
karena saya tidak ingin saya .bashrc
dibaca.
bash -c "hi () { echo hello; }; hi"
outputhello
.zsh
: alias zsh tidak berkembang bahkan dengan opsicomplete_aliases
Jawaban:
Tampaknya tidak berfungsi jika Anda mengatur alias pada baris yang sama seperti yang digunakan. Mungkin ada hubungannya dengan bagaimana alias diperluas sangat awal dalam pemrosesan baris perintah, sebelum tahap parsing yang sebenarnya. Di shell interaktif:
Perhatikan bagaimana alias yang digunakan terlambat satu baris: pada perintah kedua ia tidak menemukan alias yang baru saja disetel, dan pada perintah ketiga ia menggunakan yang sudah diset sebelumnya.
Jadi, ini berfungsi jika kita meletakkan baris baru di dalam
-c
string:(Anda juga bisa menggunakan
bash -O expand_aliases -c ...
alih-alih menggunakanshopt
dalam skrip, bukan berarti membantu dengan baris baru.)Atau, Anda bisa menggunakan fungsi shell alih-alih alias, mereka juga lebih baik dengan cara lain:
sumber
Mengubah komentar saya menjadi jawaban, seperti yang disarankan oleh ilkkachu.
Manual Bash (tertaut ke dalam pertanyaan) memang memberikan penjelasan tentang bagaimana alias ditangani ketika ada definisi alias dan perintah pada baris yang sama.
Kutipan (sedikit diformat untuk kejelasan):
jawaban ilkkachu menyediakan beberapa kemungkinan solusi untuk masalah ini.
sumber