如何在 bash 中将条件字符串传递给命令

如何在 bash 中将条件字符串传递给命令

我试图通过使用参数执行它来为我的 php 命令别名,具体取决于带有我的远程主机 IP 的文件是否存在,否则没有任何其他参数。

我用这个版本就可以使用了

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

两个问题

  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更正确。当然,您也可以将其写为一行代码,但假设您将函数保存到您的.bashrc或此类中,那么长度应该不那么重要。

答案2

(这确实是一条评论,但需要格式化。将其制作为社区维基)

请注意 (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[@]}" "$@"
}

相关内容