には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、パーアとアラーム。
また、$ 1と$ 2のデフォルト値を受け入れながら、$ 3入力でこの関数を呼び出す方法についても混乱しています。
つまり
a null null alarm2
再公開の注意:この質問をStack Overflowに投稿しましたが、この質問がUnix&Linux Stack Exchangeに属する可能性があることに気づきました。
答え1
実行からこの出力を取得する方法を理解できません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"'
ファイルの内容を表示します。引用符の外側の変数拡張は、「split+glob」操作を適用します。つまり、変数値を生成せず、その値を評価しませんが、その間にある項目はほとんど役に立ちません。バラより"file
name
with
spaces"
スペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?詳細については。
両方の問題を解決するには、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
。