相关疑难解决方法(0)

如何在Bash中将变量设置为命令的输出?

我有一个非常简单的脚本,如下所示:

#!/bin/bash

VAR1="$1"
MOREF='sudo run command against $VAR1 | grep name | cut -c7-'

echo $MOREF
Run Code Online (Sandbox Code Playgroud)

当我从命令行运行此脚本并将参数传递给它时,我没有得到任何输出.但是,当我运行$MOREF变量中包含的命令时,我能够获得输出.

我想知道如何获取需要在脚本中运行的命令的结果,将其保存到变量,然后在屏幕上输出该变量?

bash shell command-line

1513
推荐指数
14
解决办法
170万
查看次数

bash脚本:如何在管道中保存第一个命令的返回值?

Bash:我想运行一个命令并通过一些过滤器管道结果,但如果命令失败,我想返回命令的错误值,而不是过滤器的无聊返回值:

例如:

if !(cool_command | output_filter); then handle_the_error; fi
Run Code Online (Sandbox Code Playgroud)

要么:

set -e
cool_command | output_filter
Run Code Online (Sandbox Code Playgroud)

在任何一种情况下,它cool_command都是我关心的返回值- 对于第一种情况中的'if'条件,或者在第二种情况下退出脚本.

这样做有什么干净的习惯用法吗?

bash pipeline return-value

9
推荐指数
2
解决办法
4969
查看次数

bash pipestatus在backticked命令?

在bash中,如果我在反引号内执行一些管道命令,我怎样才能找到第一个命令的退出状态?

即在这种情况下,我试图获得"1".如果我不使用反引号,我可以通过PIPESTATUS [0]获得,但是当我想保存输出时它似乎不起作用:

## PIPESTATUS[0] works to give me the exit status of 'false':
$ false | true;
$ echo $? ${PIPESTATUS[0]} ${PIPESTATUS[1]};
0 1 0

## doesn't work:
$ a=`false | true`;
$ echo $? ${PIPESTATUS[0]} ${PIPESTATUS[1]};
0 0
Run Code Online (Sandbox Code Playgroud)

更一般地说,我试图完成:将某个程序输出的最后一行保存到变量,但能够判断程序是否失败:

$ myvar=` ./someprogram | tail -1 `;
$ if [ "what do i put here" ]; then echo "program failed!"; fi
Run Code Online (Sandbox Code Playgroud)

理想情况下,我也想了解发生了什么,而不仅仅是答案是什么.

谢谢.

bash pipe backticks

5
推荐指数
1
解决办法
2460
查看次数

将输出分配给变量时获取管道的退出代码(命令替换)

获取管道命令的退出代码工作正常。

echo "ABC" | false | true
echo ${PIPESTATUS[0]} ${PIPESTATUS[1]} ${PIPESTATUS[2]}
#Output is 0 1 0
Run Code Online (Sandbox Code Playgroud)

但是当我将输出分配给一个变量时,无法获得退出代码。

TEST=$(echo "ABC" | false | true)
echo ${PIPESTATUS[0]} ${PIPESTATUS[1]} ${PIPESTATUS[2]}
#Output is 0
Run Code Online (Sandbox Code Playgroud)

如何获取管道进程的退出代码?

bash shell pipe

5
推荐指数
1
解决办法
1509
查看次数

bash 从子 shell 和管道获取退出代码

我有以下 bash 脚本java_debug来记录所有 java 执行(标准和错误控制台):

#! /bin/bash
echo param1: $1
echo param2: $2

(java HelloWorld "$@" 2>&1 ) | tee /tmp/log.txt
Run Code Online (Sandbox Code Playgroud)

我运行它:

$ java_debug v1 "v2 with space"
param1: v1
param2: v2 wirh space
Error: Could not find or load main class HelloWorld

$ echo $?
0
Run Code Online (Sandbox Code Playgroud)

在此示例中,java 找不到 HelloWorld 类,因此显示错误。但是,错误在 $? 中丢失了?(我们得到 0 而不是 1)因为子 shell 和/或管道。

我需要 java_debug 返回与 java 执行相同的退出代码

如何修复这个脚本?

注意:我可以使用script命令代替2>&1 | tee,但不幸的是脚本命令的实现在不同的系统中发生了变化(Redhat 中的脚本参数与 OSX 中的脚本参数不同)。

注意:我知道 bash 是一种可怕的语言,不应该使用它;但在这种情况下我别无选择。

bash

1
推荐指数
1
解决办法
1936
查看次数

标签 统计

bash ×5

pipe ×2

shell ×2

backticks ×1

command-line ×1

pipeline ×1

return-value ×1