alias の中で動的に実行したコマンド結果を使いたい


コマンドの結果を引数にしてコマンドを実行する alias を書きたいです

具体的には特定の name のついた ec2 に SSM ログインするコマンドを書きたいので

[code]

    aws ec2 describe-instances | jq -r '.Reservations[].Instances[] | select(.Tags[].Value == "api") | .InstanceId'
    
[/code]

このコマンド結果を最後につけて

[code]

    aws ssm start-session --target <ここに結果を入れたい>
    
[/code]

を実行する alias を作りたいです

[code]

    alias api-login="aws ssm start-session --target $(aws ec2 describe-instances | jq -r '.Reservations[].Instances[] | select(.Tags[].Value == "api") | .InstanceId')"
    
[/code]

と定義してしまうと定義時に中身が展開されてしまって

[code]

    api-login='aws ssm start-session --target i-xxxxxxxx'
    
[/code]

となって値が固定されてしまいます  
コマンド実行時に内側も実行したいのですがどう書けばいいでしょうか




alias を使いたければ、ダブルクォートではなくシングルクォートで囲えば良いです。`$(...)`
の中身は、ダブルクォートだと文字列として評価される際に展開されますが、シングルクォートだとコマンドとして評価される際に展開されます。

ですが、このくらい複雑になるのであれば alias ではなくて shell の関数にする方がコードに説明がつけられて見やすくなりそうです。

[code]

    api-login () {
        local instance_id="$(aws ec2 describe-instances | jq -r '.Reservations[].Instances[] | select(.Tags[].Value == "api") | .InstanceId')"
        aws ssm start-session --target "${instance_id}"
    }
    
[/code]




alias を使いたければ、ダブルクォートではなくシングルクォートで囲えば良いです。`$(...)`
の中身は、ダブルクォートだと文字列として評価される際に展開されますが、シングルクォートだとコマンドとして評価される際に展開されます。

ですが、このくらい複雑になるのであれば alias ではなくて shell の関数にする方がコードに説明がつけられて見やすくなりそうです。

[code]

    api-login () {
        local instance_id="$(aws ec2 describe-instances | jq -r '.Reservations[].Instances[] | select(.Tags[].Value == "api") | .InstanceId')"
        aws ssm start-session --target "${instance_id}"
    }
    
[/code]

