web-dev-qa-db-ja.com

条件付き文字列を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を使用できません

私が探しているのはalias for php like

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

そして、さらに引数をエイリアスに渡せるようにしたいと思います。

1
codekandis

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より正確です。もちろん、それをワンライナーとして書くこともできますが、関数を.bashrcなどに保存していると仮定すると、長さはそれほど重要ではありません。

0
ilkkachu

(これは実際にはコメントですが、フォーマットが必要です。コミュニティwikiにしました)

(1)に注意してください

A && B || C

(2)とは根本的に異なります

if A; then B; else C; fi

この状況では、Aは成功したが、Bは失敗した場合。その場合、C 実行されます(1)では実行されますが、(2)では実行されません。

0
glenn jackman

あなたcouldエイリアスを次のようにします。

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[@]}" "$@"
}
0
glenn jackman