Bash: Gunakan alias dalam variabel


9

Saya menulis skrip bash yang menjalankan setiap argumennya sebagai perintah. Ini berfungsi untuk perintah di saya PATH, tetapi tidak untuk alias. Saya bisa langsung memanggil alias dalam skrip, tetapi saya tidak bisa memanggil alias yang telah dilewati sebagai argumen.

Masalahnya (saya berasumsi) adalah bahwa alias diperluas sebelum variabel. Apakah ada cara untuk menjalankan alias dari suatu variabel?

Contoh skrip:

#!/bin/bash
# File: runall

shopt -s expand_aliases
source ~/.aliases

while (( "$#" )); do
    $1
    shift
done

runall "echo test"bekerja, tetapi runall "myalias"memberirunall: line 8: myalias: command not found

Jawaban:


9

Setelah beberapa pengujian, saya menyimpulkan sebagai berikut:

  • Alias ​​hanya berfungsi dalam mode interaktif (tambahkan -ike shebang).
  • Alias ​​tidak dievaluasi ketika mereka berasal dari sumber yang ditafsirkan (dalam hal ini, variabel.
  • Anda bisa mendapatkan bash untuk menggunakan alias dengan eval $1. Perhatikan bahwa evalsegala sesuatu yang dibuat dengan variabel berbahaya, tetapi karena seluruh inti skrip memerlukan eksekusi sewenang-wenang, saya tidak akan membuat terlalu besar dari itu.

Dari halaman bash man:

Alias ​​tidak diperluas ketika shell tidak interaktif, kecuali jika opsi shell expansion_aliases diatur menggunakan shopt (lihat deskripsi shopt di bawah SHELL BUILTIN COMMANDS di bawah).

Jadi, Anda bisa menambahkan shopt -s expand_aliasesbukan -i.

Juga,

Alias ​​diperluas ketika perintah dibaca, bukan saat dijalankan.

Karena variabel tidak diperluas sebelum perintah dibaca, mereka tidak akan diperluas lebih lanjut menggunakan alias.


1
Bagus untuk mengetahui. Karena penasaran: mengapa evalvariabel itu berbahaya ?

1
@hesse Pertimbangkan eval "echo $1". Katakan aku menelepon ./script.sh "hello;rm -rf ~. Apa yang dieksekusi? echo hello, diikuti oleh rm -rf ~. Jelas itu adalah contoh yang dibuat-buat, tetapi prinsipnya berlaku.
Kevin

menambahkan evaldi depan $1bekerja, karena saya sudah punya shopt -s expand_aliases. Terima kasih!
Jayson

1

Saya memiliki masalah yang sama dan berhasil menyelesaikan masalah saya dengan mengubah alias saya ke fungsi, seperti yang dijelaskan di situs ini , yang bekerja untuk saya.

misalnya

alias lsd="ls -lash"

untuk

function lsd() { ls -lash; }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.