相关疑难解决方法(0)

$(stuff) 和 `stuff` 有什么区别?

命令替换有两种语法:美元括号和反引号。运行top -p $(pidof init)top -p `pidof init`给出相同的输出。这两种做同样事情的方式,还是有区别?

command-line shell command-substitution

283
推荐指数
5
解决办法
3万
查看次数

tar:从成员名称中删除前导“/”

root@server # tar fcz bkup.tar.gz /home/foo/
tar: Removing leading `/' from member names
Run Code Online (Sandbox Code Playgroud)

如何解决此问题并保留/文件名?

tar gzip

179
推荐指数
5
解决办法
32万
查看次数

为什么不带引号的带空格的参数扩展在双括号“[[”内起作用,而在单括号“[”内不起作用?

我对使用单括号或双括号感到困惑。看看这段代码:

dir="/home/mazimi/VirtualBox VMs"

if [[ -d ${dir} ]]; then
    echo "yep"
fi
Run Code Online (Sandbox Code Playgroud)

尽管字符串包含空格,但它工作得很好。但是当我将其更改为单括号时:

dir="/home/mazimi/VirtualBox VMs"

if [ -d ${dir} ]; then
    echo "yep"
fi
Run Code Online (Sandbox Code Playgroud)

它说:

./script.sh: line 5: [: /home/mazimi/VirtualBox: binary operator expected
Run Code Online (Sandbox Code Playgroud)

当我将其更改为:

dir="/home/mazimi/VirtualBox VMs"

if [ -d "${dir}" ]; then
    echo "yep"
fi
Run Code Online (Sandbox Code Playgroud)

它工作正常。有人可以解释发生了什么吗?什么时候应该在变量周围分配双引号,"${var}"以防止空格引起的问题?

bash ksh quoting test

106
推荐指数
3
解决办法
4万
查看次数

如何确定变量赋值的返回状态?

我在脚本中看到过这样的结构:

if somevar="$(somecommand 2>/dev/null)"; then
...
fi
Run Code Online (Sandbox Code Playgroud)

这是在某处记录的吗?变量的返回状态是如何确定的,它与命令替换有什么关系?(例如,我会得到相同的结果if echo "$(somecommand 2>/dev/null)"; then吗?)

bash command-substitution variable exit-status

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

如何将输出通过管道传输到另一个进程,但保留第一个进程的错误状态?

可能的重复:
获取通过管道传输到另一个进程的退出代码

我正在使用以下命令行(在 makefile 中)通过 perl 脚本将来自编译器的详细错误消息通过管道传输,该脚本将它们简化为人类可读的内容:

g++ -c source.cpp -o source.o 2>&1 | perl /bin/gSTLFilt.pl
Run Code Online (Sandbox Code Playgroud)

不幸的是,这种方法“屏蔽”了g++命令返回的错误值。make 不知道该g++命令已失败,因为它返回的只是perl命令的错误结果。

有没有办法通过管道输出,并仍然保留原始错误条件?

如果它有所不同:我在运行 GNU bash 版本 2.04.0(1)-release (i686-pc- msys) 在 Windows XP 上。

command-line pipe io-redirection error-handling

11
推荐指数
3
解决办法
6656
查看次数

分配就像具有退出状态的命令,除非有命令替换?

请参阅以下示例及其在 POSIX shell 中的输出:

  1. false;echo $?false || echo 11
  2. false;foo="bar";echo $?foo="bar" && echo 00
  3. foo=$(false);echo $?foo=$(false) || echo 11
  4. foo=$(true);echo $?foo=$(true) && echo 00

正如/sf/ask/478414121/ 上投票最高的答案所提到的:

$? 用于查找上次执行命令的返回值。

在这种情况下,这可能有点误导,所以让我们获取 POSIX 定义,该定义也在该线程的帖子中引用:

? 扩展到最近管道的十进制退出状态(请参阅管道)。

所以看起来好像一个赋值本身算作一个命令(或者更确切地说是一个管道部分),它的退出值为零,但它应用赋值的右侧之前(例如,我的示例中的命令替换调用)。

从实际的角度来看,我看到这种行为是有道理的,但对我来说,作业本身按该顺序计数似乎有些不寻常。也许为了让我更清楚为什么这对我来说很奇怪,让我们假设赋值是一个函数:

ASSIGNMENT( VARIABLE, VALUE )
Run Code Online (Sandbox Code Playgroud)

那么foo="bar"将是

ASSIGNMENT( "foo", "bar" )
Run Code Online (Sandbox Code Playgroud)

并且foo=$(false)会像

ASSIGNMENT( "foo", EXECUTE( "false" ) )
Run Code Online (Sandbox Code Playgroud)

这意味着首先EXECUTE …

shell posix command-substitution assignment exit-status

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

与 PIPE 一起使用的 Bash 退出状态

我试图了解使用管道时如何传达退出状态。假设我which用来定位一个不存在的程序:

which lss
echo $?
1
Run Code Online (Sandbox Code Playgroud)

由于which无法定位,lss我的退出状态为 1。这很好。但是,当我尝试以下操作时:

which lss | echo $?
0
Run Code Online (Sandbox Code Playgroud)

这表明最后执行的命令已经正常退出。我能理解的唯一方法是 PIPE 可能也会产生退出状态。这是正确的理解方式吗?

bash pipe shell-script exit

11
推荐指数
3
解决办法
5635
查看次数

如果第一个命令失败,则阻止第二个命令在 bash 管道中启动

在学习(或多或少)一些关于管道的有用讨论后,例如 获取通过管道传输到另一个进程的进程的退出状态管道中的一个进程失败时退出,我仍然无法避免在第一个命令失败时启动第二个命令。我是否缺少有关管道的基本细节?

所以例如

$ somecommand | tar -T - -czf /tmp/someProject.tar.gz
Run Code Online (Sandbox Code Playgroud)

tar.gz如果somecommand不能正常工作并且只产生一些错误消息而不是预期的文件列表,则不应创建几乎为空的文件。

bash zsh pipe

11
推荐指数
2
解决办法
1034
查看次数

如何在 korn shell 中捕获返回状态并同时使用 tee?

考虑源代码:

1. 父.sh

#!/usr/bin/ksh
# No tee
ksh Child.sh;
exit_status=$?;
echo "Exit status: ${exit_status}"
# Using tee
ksh Child.sh | tee -a log.txt;
exit_status=$?;
echo "Exit status: ${exit_status}"
Run Code Online (Sandbox Code Playgroud)

2. 子.sh

#!/usr/bin/ksh
...
exit 1;
Run Code Online (Sandbox Code Playgroud)

输出:

Exit status: 1
Exit status: 0
Run Code Online (Sandbox Code Playgroud)
  • 变量$exit_status正在捕获 Child.sh 的退出状态,1.
  • 在第二种情况下,$exit_status正在捕获 tee 的退出状态,即0.

那么如何捕获退出状态并使用 tee 呢?

ksh shell-script

10
推荐指数
1
解决办法
2万
查看次数

如何从最后一个命令之前获取退出状态

我有solaris机器(solaris 10)

请查看以下简单命令(haconf -makerw | grep -iq "Cluster already writable")

    # haconf -makerw 
      VCS WARNING V-16-1-10364 Cluster already writable.


    haconf -makerw | grep -iq "Cluster already writable"
    # echo $?
    0
Run Code Online (Sandbox Code Playgroud)

我从 grep 得到退出状态 0,

这是正确的(因为我们总是在最后一个命令中获得 exe 状态)

我的问题是:

如何从命令haconf -makerw 代替 grep获取退出状态( $? )?

或者需要在我的语法中添加什么才能了解​​ haconf -makerw 是否成功?

    haconf -makerw | grep -iq "Cluster already writable"
    # echo $? ( will print the exe status from haconf -makerw  )
Run Code Online (Sandbox Code Playgroud)

linux bash solaris shell-script command

8
推荐指数
0
解决办法
262
查看次数