Bash: Değişkende takma ad kullanma


9

Her argümanını bir komut olarak çalıştıran bir bash betiği yazıyorum. Bu benim komutlarımda çalışır PATH, ama takma adlar için geçerli değildir. Doğrudan koddaki bir diğer adı çağırabilirim, ancak bağımsız değişken olarak geçirilen bir diğer adı çağıramıyorum.

Sorun (sanırım) takma adların değişkenlerden önce genişletilmiş olmasıdır. Bir değişkenden takma ad çalıştırmanın bir yolu var mı?

Örnek komut dosyası:

#!/bin/bash
# File: runall

shopt -s expand_aliases
source ~/.aliases

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

runall "echo test"çalışır, ama runall "myalias"verirrunall: line 8: myalias: command not found

Yanıtlar:


9

Bazı testlerden sonra aşağıdakileri tamamladım:

  • Takma adlar yalnızca etkileşimli modda çalışır ( -isapmaya ekleyin ).
  • Takma adlar, yorumlanmış bir kaynaktan (bu durumda değişken) geldiklerinde değerlendirilmez.
  • Diğer adı kullanmak için bash alabilirsiniz eval $1. O Not evaldeğişken ile oluşturulan şey ing tehlikelidir, ancak senaryonun bütün mesele keyfi yürütme gerektirdiğinden, bunun dışında çok büyük bir anlaşma yapmak olmaz.

Bash man sayfasından:

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).

Yani shopt -s expand_aliasesyerine ekleyebilirsiniz -i.

Ayrıca,

Takma adlar, bir komut yürütüldüğünde değil, okunduğunda genişletilir.

Değişkenler komut okunmadan genişletilmediği için takma ad kullanılarak daha fazla genişletilmezler.


1
Bilmek iyi oldu. Sadece meraktan: evaldeğişkenler için neden tehlikelidir ?

1
@hesse Düşünün eval "echo $1". Ara diyorum ./script.sh "hello;rm -rf ~. Ne idam ediliyor? echo hello, ardından rm -rf ~. Açıkçası bu tartışmalı bir örnek, ama prensip geçerli.
Kevin

ekleyerek evalönünde $1Zaten beri çalıştı shopt -s expand_aliases. Teşekkürler!
Jayson

1

Benzer bir sorun yaşadım ve benim için çalışan bu sitede açıklanan takma adları işlevlere çevirerek sorunumu çözmeyi başardım .

Örneğin

alias lsd="ls -lash"

için

function lsd() { ls -lash; }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.