Bash içinde çok satırlı takma ad


13

Aşağıdaki komut dosyası var. aHerhangi bir dize değeri olan ve bbir yol olması gereken basit bir test durumudur .

#!/bin/bash

alias jo "\
echo "please enter values "\
read a \
read -e b \
echo "My values are $a and $b""

Ancak ./sample.sh dosyasını çalıştırmaya çalıştığımda aşağıdaki hataları alıyorum:

./sample.sh: line 3: alias: jo: not found
./sample.sh: line 3: alias: echo please: not found
./sample.sh: line 3: alias: enter: not found
./sample.sh: line 3: alias: values: not found
./sample.sh: line 3: alias: read a read -e b echo My: not found
./sample.sh: line 3: alias: values: not found
./sample.sh: line 3: alias: are: not found
./sample.sh: line 3: alias: and: not found
./sample.sh: line 3: alias: : not found

ve denediğimde source sample.shaşağıdakileri alıyorum:

a: Undefined variable.

Amacım, bu komut dosyasını kaynaklayabilmem ve yalnızca komut satırını yürütmek için takma adı çalıştırabilmem için bu bir takma ad yapmaktı. Birisi buna bakıp hatanın ne olduğunu bana bildirebilir mi?


3
Çok satırlı ve çok komutlu takma ada ihtiyacınız olduğunu düşündüğünüzde, bir işlev tanımlama veya bir komut dosyası oluşturma zamanı gelmiştir.
Sergiy Kolodyazhnyy

@SergiyKolodyazhnyy kaydetti
Jovin Miranda

Yanıtlar:


15

Burada birkaç sorun var

  1. cshiçinde bash(ve Bourne benzeri kabuklarda) aksine , takma adlara bir =işaret atanır;alias foo=bar

  2. tırnak işaretleri bu şekilde iç içe olamaz; bu durumda, takma ad etrafında tek tırnak ve içindeki çift tırnak kullanabilirsiniz

  3. ters eğik çizgi \bir satır devam karakteridir: sözdizimsel olarak, komutunuzu tek bir satıra dönüştürür (istediğinizin tersi)

Yani

#!/bin/bash

alias jo='
echo "please enter values "
read a 
read -e b 
echo "My values are $a and $b"'

Test: önce dosyayı kaynaklıyoruz:

$ . ./myscript.sh

sonra

$ jo
please enter values 
foo bar
baz
My values are foo bar and baz

Bir kod içindeki diğer adı kullanmak istiyorsanız, diğer adların yalnızca etkileşimli kabuklarda varsayılan olarak etkinleştirildiğini unutmayın: bunları bir komut dosyasında etkinleştirmek için eklemeniz gerekir

shopt -s expand_aliases

Yukarıdaki her şeyden bağımsız olarak, bunun gibi şeyler için bir takma ad yerine kabuk işlevi kullanmayı düşünmelisiniz


1
Takma tek tırnak kullanmak başka neden çift tırnak içine değişkenler zaman genişletilmiş olmasıdır $ave $bdiğer ad yürütüldüğünde değilken, tanım zamanda genişletileceğini bildirdi.
Barmar

Çözüm için teşekkürler, burada sorun bana sizin tarafınızdan verilen komut dosyası yazarken rağmen ve i yürüttüğümde ben jo olsun: komut kayıtlı değil nedense takma ad bulunamadı. Ben dosya kaynak sonra ben bu hatayı Eşleşmeyen olsun ". i diğer adı yapıyorum ve fonksiyon değil tek neden i komut satırında bu kod satırını aramak istiyorum ve işlev i nasıl bunu elde etmek bilmiyorum. ben gördüm Takma adın kullanımı genellikle kod içinde. Takma adın kullanımı sadece bir fonksiyon gibi kullanabileceğimi ve istediğim zaman arayabildiğimi sağlamaktı
Jovin Miranda

neyse sabit, ben tcsh olarak varsayılan kabuk kullanıyordum dolayısıyla sorun geliyordu.
Jovin Miranda

8

POSIX tipi kabuktaki işlevleri kullanmaya alışın. Alıntılama sorunlarından hiçbiriniz yok:

jo () {
    read -p "Enter value for 'a': " -e a 
    read -p "Enter value for 'b': " -e b 
    echo "My values are $a and $b"
}

Çözüm için teşekkürler, ben komut dosyası içindeki işlevi çağırdığınızda bu işe yaradı. Komut satırının kendisinden işlevi nasıl çağırabilirim, bu tür birden çok komut dosyasına sahip olursam ve tüm işlevleri tek bir dosyada yazıp bunun yerine komut satırından çağırdığım bir durum istiyorum. Takma ad için gittiğim tüm sebep buydu
Jovin Miranda

Tamamen aynı. İşlevleri bir dosyaya koyun ve bu dosyayı kaynaklayın
Glenlen Jackman

Aslında yaptığım foll kullanmak var. komut "$ @" böylece dosyayı yürütürken işlev adını çağırabilirsiniz
Jovin Miranda
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.