【问题标题】:Bash Scripting - shell command output redirectionBash 脚本 - shell 命令输出重定向
【发布时间】:2009-02-06 07:11:41
【问题描述】:

谁能帮忙解释一下:

如果我输入:

a=`ls -l`

然后ls命令的输出保存在变量a

但如果我尝试:

a=`sh ./somefile`

结果输出到shell(stdout)而不是变量a

我所期望的是 shell 尝试执行脚本“somefile”以存储在变量中的结果操作。

请指出我的理解有什么问题以及一种可能的方法。

谢谢。

编辑:

澄清一下,脚本“somefile”可能存在也可能不存在。如果它存在,那么我希望将脚本的输出存储在“a”中。如果没有,我希望将错误消息“没有这样的文件或目录”存储在'a'中

【问题讨论】:

    标签: bash shell scripting


    【解决方案1】:

    我认为是因为 shell 可能会将自己附加到 /dev/tty 但我可能错了。为什么不直接在脚本上设置执行权限并使用:

    a=`./somefile`
    

    如果你想捕获标准错误标准输出到a,只需使用:

    a=`./somefile 2>&1`
    

    首先检查文件是否可执行:

    if [[ -x ./somefile ]] ; then
        a=$(./somefile 2>&1)
    else
        a="Couldn't find the darned thing."
    fi
    

    您会注意到我正在切换到 $() 方法而不是反引号。我更喜欢 $() 因为你可以嵌套它们(例如,“a=$(expr 1 + $(expr 2 + 3))”)。

    【讨论】:

    • 这与权限无关...我希望将错误消息或返回值存储在变量中。
    • 我的意思是你不需要运行 sh 来运行脚本(如果你这样做的话 sh 会在输出上强加自己的防火墙)。只需直接运行脚本,为此,您需要 'chmod +x' 它。
    • 尝试以下操作:“chmod u+x somefile; a=./somefile”然后看看 a 设置为什么。
    • 但对于我的情况 somefile 我不存在,如何避免在 shell 中看到消息“没有这样的文件或目录”,而是将其存储在变量中
    • "如果 [[ -x ./somefile ]]" 是您要查找的内容。
    【解决方案2】:

    您可以尝试新的和改进的命令替换方式,使用 $() 代替反引号。

    a=$(sh ./somefile)
    

    如果仍然无法正常工作,请检查 somefile 是否实际上 stderr 正在运行。

    【讨论】:

    • 可能实际上找不到某个文件;)
    【解决方案3】:

    你是对的,./somefile 的标准输出存储在变量a 中。但是,我假设 somefile 输出到 stderr。您可以在./somefile 之后直接使用2>&1 重定向它。

    【讨论】:

    • 哦,我想我明白了,所以在 'somefile' 不存在的情况下,存储在 a 中的输出只不过是脚本默认重定向到 stderr,这就是为什么我在屏幕上看到错误消息为反对存储在变量中?
    • 没有 sh 的标准输出存储在 a 中,sh 没有将 ./somefile 的标准输出传回给它的调用者。
    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 2021-09-08
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 2014-11-17
    相关资源
    最近更新 更多