it-swarm-tr.com

Bash betiğim neden takma adları tanımıyor?

~/.bashrc Dosyamda iki tanım var:

  1. commandA, daha uzun bir yolun takma adı
  2. Bash betiğinin diğer adı olan commandB

Aynı dosyayı bu iki komutla işlemek istiyorum, bu yüzden aşağıdaki Bash betiğini yazdım:


#!/bin/bash

for file in "[email protected]"
    do
    commandA $file
    commandB $file
done

Oturumumdan çıkıp tekrar giriş yaptıktan sonra bile, Bash bu komut dosyasını çalıştırdığımda her iki komut için de command not found Hatalarıyla karşılaşıyor.

Neyi yanlış yapıyorum?

237
Zaid

Her şeyden önce, ddeimeke'nin dediği gibi, varsayılan olarak takma adlar etkileşimli olmayan kabuklarda genişletilmez.

İkinci olarak, .bashrc, BASH_ENV Ortam değişkenini ayarlamadığınız sürece etkileşimli olmayan kabuklar tarafından okunmaz.

Ama en önemlisi: bunu yapma! Lütfen? Bir gün bu komut dosyasını gerekli takma adların ayarlanmadığı bir yere taşıyacaksınız ve tekrar kırılacak.

Bunun yerine kodunuzda ortam değişkenlerini kısayol olarak ayarlayın ve kullanın:

#!/bin/bash

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

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

Eğer bash man sayfasına bakarsanız:

Expand_aliases Shell seçeneği shopt kullanılarak ayarlanmadığı sürece, kabuk etkileşimli olmadığında takma adlar genişletilmez (aşağıdaki Shell BUILTIN COMMANDS altındaki shopt açıklamasına bakın).

Öyleyse bir

shopt -s expand_aliases

betiğinizde.

Komut dosyanızı bunu ayarladıktan sonra takma ad dosyanızı kaynakladığınızdan emin olun.

shopt -s expand_aliases
source ~/.bash_aliases
175
ddeimeke

Takma adlar dışa aktarılamaz, bu nedenle tanımlanmadığı Shell komut dosyalarında bulunmazlar. Başka bir deyişle, bunları ~/.bashrc bunlar your_script.sh (kaynak~/.bashrc komut dosyasında, ben tavsiye etmem ama bunu düzgün yapmanın yolları vardır).

Ancak, işlevler dışa aktarılabilir ve tanımlandıkları ortamdan çalıştırılan Shell komut dosyaları için kullanılabilir. Bunu bashrc'nize yerleştirerek yapabilirsiniz:

 foo () 
 {
 echo "Merhaba Dünya!" 
} 
 ihracat -f foo 

Bash kılavuzunun dediği gibi, "Neredeyse her amaç için, kabuk işlevleri takma adlara tercih edilir."

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

i etkileşimli içindir ve bash profilinizi sizin için kaynaklandırır.

11
user65576