bashでコマンドに条件付き文字列を渡す方法

bashでコマンドに条件付き文字列を渡す方法

私のリモートホストのIPを持つファイルが存在するかどうかに応じてパラメータを使用して実行し、それ以外の場合は他のパラメータなしでPHPコマンドを実行してエイリアスを指定しようとしています。

このバージョンが利用可能です。

#!/bin/bash
alias php="[ -f path/to/hostip ] && php -dxdebug.remote_host=\"$( < path/to/hostip )\" || php

2つの質問

  1. 長すぎる(贅沢問題)
  2. 呼び出すと、追加php path/to/any/scriptのパラメータはPHP呼び出しに渡されません。

関数を試してみましたが、問題#2が修正されました。

#!/bin/bash
function phpx {
    if [ -f path/to/hostip ]; then
        php -dxdebug.remote_host="$( < path/to/hostip )" "$@"
    else
        php "$@"
    fi
}

しかし、私はまだ問題があります。

  1. もっと長く(ラグジュアリー問題)
  2. php関数名のエイリアスとしては使用できません。

私が探しているのはニックネームphpいいね

alias php='php ( condition | true > pass file content as argument | false > pass nothing )'

エイリアスに追加のパラメータを渡すことができるようにしたいです。

答え1

help command:

command: command [-pVv] command [arg ...]
    Execute a simple command or display information about commands.

したがって、command php "$@"関数内で実行すると、関数の再呼び出しを回避できます。または/usr/bin/php正しいパスを知る必要があります。

[ condition ] && php args.. || php other args関数内でこのトリックを引き続き使用できますが、php最初のphpコマンドが失敗した場合は後者のコマンドも実行されるため、if .. then .. elseより正確です。もちろん、これを1行のコードで書くこともできますが、関数を自分または.bashrcこのクラスに保存すると仮定すると、長さはそれほど重要ではありません。

答え2

(これは実際にコメントですが、フォーマットを指定する必要があります。コミュニティWikiで作成してください。)

参考(1)

A && B || C

(2)と根本的に異なる

if A; then B; else C; fi

この場合:Aは成功しましたが、Bは失敗しました。このような場合はC実行できます(1)にはありますが(2)にはありません。

答え3

あなたできるエイリアスを次のようにしてください。

alias php='_php_opts=(); [[ -f /path/to/hostip ]] && _php_opts+=( -dxdebug.remote_host="$( < path/to/hostip )" ); php "${_php_opts[@]}"`

しかし、グローバル変数の名前空間を汚染することなく読み取り可能なものを作成できますが、なぜそれを行うのですか?

php() {
    local _php_opts=()
    [[ -f /path/to/hostip ]] && _php_opts+=( -dxdebug.remote_host="$( < path/to/hostip )" )
    command php "${_php_opts[@]}" "$@"
}

関連情報