にはbashrc
、3つの変数をとることができるこのアラーム機能があります。
a () {
local $1="${1:-3600}"
local $2="${2:-paa}"
local $3="${3:-alarm}"
sleep "$1" && $2 && $3
}
alias pah='pactl set-card-profile 0 output:hdmi-stereo'
alias paa='pactl set-card-profile 0 output:analog-stereo'
alias alarm='vlc ~/alarm.mp3'
コマンドラインで、次のコマンドはエイリアスを正常に実行します。
sleep 3600 && paa && alarm
ただし、上記の関数のこの部分を作成しようとすると、次のエラーが発生します。
bash: pah: command not found
また、$ 1、$ 2、$ 3の変数は、デフォルトで3600、paa、およびalarmに設定されている必要があります。
また、$ 1と$ 2をデフォルトにできるようにしながら、$ 3の入力でこの関数を呼び出す方法についても混乱しています。
すなわち。
a null null alarm2
再投稿注:私はこれをStack Overflowに投稿しましたが、この質問はおそらくUnixとLinuxのスタック交換に属していることに気づきました。
実行からこの出力を取得する方法がわかりませんa
:別のバージョンからの出力を投稿しましたか?しかしとにかく、私はコードの何が問題なのかわかります。
最初の問題は、local $1=…
あなたが思っていることをしていないということです。名前が最初のパラメーターである変数を設定しますが、最初のパラメーターは設定しません。たとえば、関数をとして呼び出すa foo
と、最初の行でローカル変数foo
が値に設定されますfoo
。a
引数なしで呼び出すと、次のようになります。
bash: local: `=3600': not a valid identifier
(およびその他のエラー)左側に=
あるのは空の文字列であり、空の文字列は変数の有効な名前ではないためです。
割り当て構文を使用して番号付きパラメーターを設定することはできませんlocal 1=…
。どちらも機能しません。変数に名前を付けるか、set
組み込みを使用してすべての番号付きパラメーターを一度に設定する必要があります。
a () {
local delay="${1:-3600}"
local first_command_to_split_and_glob="${2:-paa}"
local second_command_to_split_and_glob="${3:-alarm}"
sleep "$delay" && $first_command_to_split_and_glob && $second_command_to_split_and_glob
}
2番目の問題は、エイリアスがコマンドの先頭に明示的に表示されている場合にのみ展開されることです。それらは、変数の値を取るなど、他のいくつかの展開の結果から展開されません。
呼び出しには別の問題があります$first_command_to_split_and_glob
。それは、単純な場合にのみ機能することです。変数の値(つまり、関数に渡される引数)を空白で分割し、各部分をワイルドカードパターンとして解釈し、パターンが少なくとも1つのファイル名と一致する場合に展開します。たとえばa 2 'cat "file name with spaces"'
と呼ばれるファイルの内容を表示しようとすると"file
、name
、with
とspaces"
。引用符の外側の変数展開は、「split + glob」操作を適用します。これは、変数の値を生成せず、値の評価も実行しませんが、ほとんど役に立たない中間的なものです。シェルスクリプトが空白やその他の特殊文字でチョークするのはなぜですか?を参照してください。詳細については。
これらの2つの問題を修正するeval
には、文字列でを使用します。周りに二重引用符に注意"$first_command"
して"$second_command"
分割+グロブを避けるために。
a () {
local delay="${1:-3600}"
local first_command="${2:-paa}"
local second_command="${3:-alarm}"
sleep "$delay" && eval "$first_command" && eval "$second_command"
}
最後に、空の引数を渡すには、引用符を使用して空の文字列を区切ります。例えば:
a '' pah
3600秒待機してから実行しpah
、次に実行しalarm
ます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加