如何在 bash 中拦截和删除命令行参数

     2023-02-24     134

关键词:

【中文标题】如何在 bash 中拦截和删除命令行参数【英文标题】:How to intercept and remove a command line argument in bash 【发布时间】:2014-02-27 19:21:23 【问题描述】:

“升级”到 Mavericks 和 Xcode 5 后,我需要处理各种小问题,以使 Xcode 编译我的一些旧项目。

Xcode 似乎正在向ld 链接器传递一个新参数,并且确实没有阻止 Xcode 这样做。 ld 的旧版本,由于各种原因我需要它,当看到它不知道的参数时会出错(因此我的项目无法编译)。

我需要的是对旧版本的ld 进行薄包装,以在某些情况下删除“坏”参数。我认为 bash shell 脚本会很完美,但 bash 不是我的强项。

这是我得到的:

# Look for conditions necessary to use older ld
... # (placeholder, obviously)

# Run older ld (pseudo condition)
if [ <old_ld_condition> ]; then
    ARGS=''
    for var in "$@"; do
        # Ignore known bad arguments
        if [ "$var" = '-dependency_info' ]; then
            continue
        fi

        ARGS="$ARGS $var"
    done

    /path/to/old/ld "$ARGS"
else
    /path/to/new/ld "$@"
fi

但是,运行 /path/to/old/ld "$ARGS" 会导致 ld 将整个 $ARGS 字符串解释为一个参数。运行 /path/to/old/ld $ARGS 会导致 ld 收到以前转义字符串的未转义版本。

很明显,我对$@ 的性质、如何操作它以及如何将该操作传递给旧的ld 有一些误解。谢谢大家。

【问题讨论】:

你可以在Xcode中选择命令行工具集版本,不知道对你有没有帮助?通常,除非您进行了全新安装,否则旧的 SDK 和命令行工具集版本将共存。 这些项目是实际的 Xcode .xcodeproj 文件,不幸的是我无法将它们带到命令行构建过程(例如 make)。不过感谢您的建议。 【参考方案1】:

这应该可行:

# Run older ld (pseudo condition)
if [ <old_ld_condition> ]; then
    ARGS=()
    for var in "$@"; do
        # Ignore known bad arguments
        [ "$var" != '-dependency_info' ] && ARGS+=("$var")
    done

    /path/to/old/ld "$ARGS[@]"
else
    /path/to/new/ld "$@"
fi

【讨论】:

【参考方案2】:

如果你真的想要继续使用 bash,你应该使用 Bash 数组:

declare -a ARGS
for var in "$@"; do
    # Ignore known bad arguments
    if [ "$var" = '-dependency_info' ]; then
        continue
    fi
    ARGS[$#ARGS[@]]="$var"
done

现在"$ARGS[@]" 可以像"$@" 一样使用。 man bash 了解更多信息。

【讨论】:

如何转义变量中的特殊字符以在 bash 中提供命令行参数

】如何转义变量中的特殊字符以在bash中提供命令行参数【英文标题】:Howtoescapespecialcharactersinavariabletoprovidecommandlineargumentsinbash【发布时间】:2017-04-1803:03:42【问题描述】:我经常使用find在巨大的源代码树中搜索文件和符号。... 查看详情

在 Bash 中解析命令行参数的最佳方法是啥?

】在Bash中解析命令行参数的最佳方法是啥?【英文标题】:BestwaytoparsecommandlineargsinBash?在Bash中解析命令行参数的最佳方法是什么?【发布时间】:2013-01-2501:40:26【问题描述】:经过几天research,我仍然想不出在.sh脚本中解析cmdli... 查看详情

如何从 Bash 中的文件调用多个命令行参数?

】如何从Bash中的文件调用多个命令行参数?【英文标题】:HowtocallseveralcommandlineargumentsfromafileinBash?【发布时间】:2020-03-2905:54:13【问题描述】:我有一个编译的C++程序需要2个命令行参数才能运行-例如,如果我的参数是“10”和... 查看详情

Bash 命令行和输入限制

】Bash命令行和输入限制【英文标题】:Bashcommandlineandinputlimit【发布时间】:2013-10-2116:50:45【问题描述】:在bash(或其他shell)中是否对输入的长度施加了某种字符限制?如果有,字数限制是多少?即是否可以在bash中编写一个太... 查看详情

在 bash 命令行上,如何删除光标前的所有字母?

】在bash命令行上,如何删除光标前的所有字母?【英文标题】:Onbashcommand-line,howtodeletealllettersbeforecursor?【发布时间】:2012-09-0207:21:30【问题描述】:在bash命令行中,如何删除光标前的所有字母?我知道Ctrl-k会删除光标之后的... 查看详情

在 linux/bash 中添加到命令行参数

】在linux/bash中添加到命令行参数【英文标题】:Prependtocommandlineargumentsinlinux/bash【发布时间】:2014-03-1411:24:03【问题描述】:我想将提供给脚本的命令行参数传递给另一个命令,但我还想先在前面添加一些额外的参数。我怎么能... 查看详情

访问 bash 命令行参数 $@ vs $*

】访问bash命令行参数$@vs$*【英文标题】:Accessingbashcommandlineargs$@vs$*【发布时间】:2012-09-0102:55:08【问题描述】:在许多SO问题和bash教程中,我看到我可以通过两种方式访问​​bash脚本中的命令行参数:$~>cattestargs.sh#!/bin/bashec... 查看详情

访问 bash 命令行参数 $@ vs $*

】访问bash命令行参数$@vs$*【英文标题】:Accessingbashcommandlineargs$@vs$*【发布时间】:2012-09-0102:55:08【问题描述】:在许多SO问题和bash教程中,我看到我可以通过两种方式访问​​bash脚本中的命令行参数:$~>cattestargs.sh#!/bin/bashec... 查看详情

如何在 awk 脚本中传递命令行参数

】如何在awk脚本中传递命令行参数【英文标题】:howtopassacommandlineargumentintheawkscript【发布时间】:2021-02-0111:52:22【问题描述】:以前有人问过这类问题,但不完全是这个问题。我是bash和awk脚本的新手。所以我不知道如何完成我... 查看详情

带有命令行参数的 C++ 的 Makefile 和 Bash 脚本

】带有命令行参数的C++的Makefile和Bash脚本【英文标题】:MakefileandBashscriptforC++withcommandlinearguments【发布时间】:2016-06-0708:55:17【问题描述】:对于我的家庭作业,我刚刚编写了一个c++程序,当你运行它时应该提供一个命令行参数... 查看详情

Bash 中的命令行参数 [重复]

】Bash中的命令行参数[重复]【英文标题】:CommandlineargumentsinBash[duplicate]【发布时间】:2012-08-1517:04:37【问题描述】:我想编写一个带有不同参数的bash脚本。它应该像普通的linux控制台程序一样使用:my_bash_script-p2-l5-t20所以值2应... 查看详情

在 bash for 循环中使用命令行参数范围打印包含参数的括号

】在bashfor循环中使用命令行参数范围打印包含参数的括号【英文标题】:Usingcommandlineargumentrangeinbashforloopprintsbracketscontainingthearguments【发布时间】:2011-08-0703:50:08【问题描述】:这可能是一个蹩脚的问题。但是我从命令行[bashscr... 查看详情

如何从 Git Bash 中将命令行参数传递给 Windows 应用程序?

】如何从GitBash中将命令行参数传递给Windows应用程序?【英文标题】:HowtopasscommandlineargumentstoaWindowsappfromwithintheGitBash?【发布时间】:2018-02-1400:46:09【问题描述】:我正在尝试在Windows上的GitBash中运行devenv。devenv接受/buildDebug或/pr... 查看详情

bash入门教程10-处理用户输入

用户输入参数是程序运行的必要条件,如何在Bash中调用输入的参数,将Bash和GCC联合调试,这是linux工程师必备的一个能力。$./shawn1030??这是一个很典型的例子,后面两个就是传入bash的命令行参数。bashshell会将一些成为位置参数... 查看详情

如何转义任意字符串以用作 Bash 中的命令行参数?

】如何转义任意字符串以用作Bash中的命令行参数?【英文标题】:HowcanIescapeanarbitrarystringforuseasacommandlineargumentinBash?【发布时间】:2011-09-1211:29:36【问题描述】:我有一个字符串列表,我想在单个Bash命令行调用中将这些字符串... 查看详情

如何在 bash 中正确“转发”函数参数?

】如何在bash中正确“转发”函数参数?【英文标题】:Howdoesoneproperly"forward"functionargumentsinbash?【发布时间】:2012-05-0114:46:33【问题描述】:我想知道如何将bash中的函数参数正确“转发”到另一个函数或程序。例如,在Mac... 查看详情

如何在 C# 中解析命令行参数 [重复]

】如何在C#中解析命令行参数[重复]【英文标题】:HowtoParseCommandLineArgumentsinC#[duplicate]【发布时间】:2013-02-1510:38:51【问题描述】:我正在尝试制作一个C#应用程序,它接受命令行参数(用户名和密码)并将它们都声明为变量,因... 查看详情

如何在 Bash 参数中保留引号? [复制]

】如何在Bash参数中保留引号?[复制]【英文标题】:HowtokeepquotesinBasharguments?[duplicate]【发布时间】:2010-12-1217:21:58【问题描述】:我有一个Bash脚本,我想在传递的参数中保留引号。例子:./test.shthisis"sometest"然后我想使用这些参... 查看详情