bashの複数行エイリアス


13

次のスクリプトがあります。これaは、任意の文字列値でありb、パスであると想定される単純なテストケースです。

#!/bin/bash

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

ただし、。/ sample.shを実行しようとすると、次のエラーが発生します。

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

そして、私が試してみるsource sample.shと、次のものが得られます:

a: Undefined variable.

私の目的は、これをエイリアスにして、このスクリプトを入手し、エイリアスを実行してコマンド行を実行できるようにすることでした。誰かがこれを見て、エラーを教えてもらえますか?


3
複数行および複数コマンドのエイリアスが必要だと思う場合は、関数を定義するか、スクリプトを作成します。
セルギーコロディアズニー

@SergiyKolodyazhnyyは次のように指摘しました
ジョビンミランダ

回答:


15

ここにいくつか問題があります

  1. 異なりcsh、中bash(および他のボーンのようなシェル)、別名が割り当てられているとの=兆候などalias foo=bar

  2. 引用符をそのようにネストすることはできません。この場合、エイリアスを一重引用符で囲み、内部で二重引用符を使用できます

  3. バックスラッシュ\行継続文字です。構文的には、コマンドが1行になります(必要なものの反対)

そう

#!/bin/bash

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

テスト:最初にファイルを入手します:

$ . ./myscript.sh

それから

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

スクリプト内でエイリアスを使用する場合、エイリアスは対話型シェルでデフォルトでのみ有効になっていることに注意してください。スクリプトでエイリアスを有効にするには、追加する必要があります。

shopt -s expand_aliases

上記のすべてに関係なく、このようなもののエイリアスではなくシェル関数の使用を検討する必要があります


1
エイリアスの周りに単一引用符を使用するもう1つの理由は、二重引用符内の変数が展開されていることであるので、$aそして$bエイリアスが実行されると、定義時にない展開されます。
バーマー

ソリューションのおかげで、ここでの問題は、私があなたから与えられたスクリプトを書いているにもかかわらず、私がそれを実行すると、jo:command not found alias for何らかの理由で登録されません。ファイルをソースにすると、このエラーUnmatched "が表示されます。機能ではなくエイリアスを実行している唯一の理由は、コマンドラインでこのコード行を呼び出したいためです。関数呼び出しは、通常、スクリプト内にある別名の使用法はちょうど私が関数のようにそれを使用し、私はそれをいつでも呼び出すことができます確保することでした。
Jovinミランダ

とにかくそれを修正し、tcshとしてデフォルトのシェルを使用していたため、問題が発生していました。
ジョビンミランダ

8

POSIXタイプのシェルで関数を使用することに慣れてください。引用の問題はありません:

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

ソリューションのおかげで、スクリプト内で関数を呼び出すと、これは機能しました。コマンドライン自体から関数を呼び出すには、そのようなスクリプトが複数あり、すべての関数を1つのファイルに書き込みますが、代わりにコマンドラインから呼び出すような状況が必要です。それが私が別名を
選ん

まったく同じです。関数をファイルに入れ、そのファイルをソース
グレンジャックマン

私が実際にやったことは、follを使用することです。コマンド「$ @」を実行して、ファイルの実行中に関数名を呼び出せるようにする
ジョビンミランダ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.