関数内の複数の変数はエイリアスとして表示されません。私の構文に問題があると思います。

関数内の複数の変数はエイリアスとして表示されません。私の構文に問題があると思います。

にはbashrc3つの変数を使用する警告関数があります。

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値に設定しますfooaパラメータなしで呼び出すと、次の結果が表示されます。

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」操作を適用します。つまり、変数値を生成せず、その値を評価しませんが、その間にある項目はほとんど役に立ちません。バラより"filenamewithspaces"スペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?詳細については。

両方の問題を解決するには、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

関連情報