it-swarm-id.com

Mengapa skrip Bash saya tidak mengenali alias?

Dalam file ~/.bashrc Saya berada dua definisi:

  1. commandA, yang merupakan alias untuk jalur yang lebih panjang
  2. commandB, 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 "[email protected]"
    do
    commandA $file
    commandB $file
done

Bahkan setelah keluar dari sesi saya dan masuk kembali, Bash meminta saya dengan kesalahan command not found Untuk kedua perintah ketika saya menjalankan skrip ini.

Apa yang saya lakukan salah?

237
Zaid

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 mengatur BASH_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:

#!/bin/bash

CMDA=/path/to/gizmo
CMDB=/path/to/huzzah.sh

for file in "[email protected]"
do
    $CMDA "$file"
    $CMDB "$file"
done
125
user601

Jika Anda melihat ke halaman bash, Anda menemukan:

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

Jadi letakkan a

shopt -s expand_aliases

dalam skrip Anda.

Pastikan untuk mencari file alias Anda setelah mengatur ini di skrip Anda.

shopt -s expand_aliases
source ~/.bash_aliases
175
ddeimeke

Alias ​​tidak dapat diekspor sehingga tidak tersedia dalam skrip Shell yang tidak didefinisikan. Dengan kata lain, jika Anda mendefinisikannya dalam ~/.bashrc mereka tidak tersedia untuk your_script.sh (kecuali Anda sumber ~/.bashrc dalam skrip, yang tidak akan saya rekomendasikan tetapi ada cara untuk melakukan ini dengan benar).

Namun, fungsi dapat diekspor dan akan tersedia untuk skrip Shell yang dijalankan dari lingkungan di mana mereka didefinisikan. Ini bisa dilakukan dengan menempatkan ini di bashrc Anda:

 foo () 
 {
 gema "Hello World!" 
} 
 ekspor -f foo 

Seperti yang dikatakan oleh manual Bash, "Untuk hampir semua tujuan, fungsi Shell lebih disukai daripada alias."

[cmd line] > bash -i [your script's file path]

i untuk interaktif dan sumber profil bash untuk Anda.

11
user65576