İşlev parametreleri tarafından sağlanan komutu yürütme


17

Parametreler tarafından yönteme sağlanan bir komutu yürüten bir bash komut dosyasında bir işlev yöntemi oluşturmaya çalışıyorum.

Bunun gibi anlamlar:

special_execute()
{
    # Some code

    # Here's the point where the command gets executed
    $@

    # More code
}

special_execute echo "abc"

Zaten Denedim $@, "$@", $*, "$*"bunu nasıl yapabildin?


$@benim için çalışıyor .. special() { $@; }... special echo "foo"verirfoo
Drav Sloan

Benim için çalışmadı: perl -MTime::HiRes=sleep -le 'for(1..100) { print; sleep 0.05; }'vetar -cvf "backups/test.tar" -P "backups/uncompressed_server_backup_(DO NOT TOUCH!)/server/"
BrainStone

3
tırnak işareti kullanın "$@", o zaman daha fazla başarı elde
edersiniz

Tamam. Şimdi çalışıyor. gerçek çağrı etrafında kodu berbat gibi görünüyor.
BrainStone

sorun değil, hepimizin o anları var :)
Drav Sloan

Yanıtlar:


11

Argümanları işleve aktarırken bunun sadece bir alıntı olduğunu düşünüyorum.

Şöyle aramayı deneyin:

$ special_execute "echo 'abc'"
'abc'

Tek tırnakları istemiyorsanız, alıntıyı şu şekilde abcdeğiştirin:

$ special_execute "echo abc"
abc

Hata ayıklama

Fonksiyonun iç kısımlarını, daha fazla ayrıntı ile yankılanacak şekilde sarabilirsiniz.

$ function special_execute() { set -x; "$@"; set +x; }

Daha sonra işlev aracılığıyla komutları çalıştırdığınızda, special_executeneler olduğunu görebilirsiniz.

ps örneği:

$ special_execute ps -eaf
+ ps -eaf
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Aug21 ?        00:00:01 /sbin/init
root         2     0  0 Aug21 ?        00:00:00 [kthreadd]
...

perl örneği:

$ special_execute perl -MTime::HiRes=sleep -le 'for(1..10) { print; sleep 0.05; }'
+ perl -MTime::HiRes=sleep -le 'for(1..10) { print; sleep 0.05; }'
1
2
3
4
5
6
7
8
9
10
+ set +x

Ayrıştırma bağımsız değişkeni $1

Olarak iletilen argümanları ayrıştırmak için böyle bir şey yapabilirsiniz $1.

$ function special_execute() { 
    [ "$1" -eq "-123" ] && echo "flagY" || echo "flagN"; 
    shift; 
    set -x; "$@"; set +x; 
  }

Misal

hata ayıklama etkinken:

$ special_execute -123 perl -MTime::HiRes=sleep -le 'for(1..5) { print; sleep 0.05; }'
flagY
+ perl -MTime::HiRes=sleep -le 'for(1..5) { print; sleep 0.05; }'
1
2
3
4
5
+ set +x

hata ayıklama kapalı - -123:

$ special_execute -123 perl -MTime::HiRes=sleep -le 'for(1..5) { print; sleep 0.05; }'
flagY
1
2
3
4
5

hata ayıklama kapalı - -456:

$ special_execute -456 perl -MTime::HiRes=sleep -le 'for(1..5) { print; sleep 0.05; }'
flagN
1
2
3
4
5

Takma adları kullanırken neden 'komut bulunamadı' hatası alıyorum?
Elie G.

@DrunkenPoney - böyle bir cmd yok alias.
slm
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.