小编Zol*_* K.的帖子

bash,从重定向循环返回,安全吗?

请注意,我们从一个循环返回,该循环被重定向。

我不知道,我是否应该担心“文件”的写入缓冲区。

function f {
    i=1
    while :
    do
        echo aaaaaaaaaaaaabbbbbbbbbbbbbbbbb
        ((i++))
        if [ $i -gt 3 ]
        then
            return    # return while redirected
        fi
    done >> file    # writing to file
}

f
Run Code Online (Sandbox Code Playgroud)

注意:我知道这个函数可以很容易地重写,所以它不会从重定向循环内返回。但是,这只是针对此问题的一个简化示例。

因此,请不要尝试改进代码。

我对解决方法也不感兴趣。

我唯一的问题是,是否有我应该特别注意的事情。就像文件描述符没有正确关闭。或者有时我可以期望只有一半的缓冲区(即“aaaaaa”)被写入文件。

我想知道,如果这是一个非常糟糕的主意,为什么?或者它可能会在没有不可预见的竞争条件或类似条件的情况下工作?(但同样,我不想要像“这很糟糕,因为你应该使用这个和这个模式”这样的答案)

bash io-redirection function

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

bash 链式逻辑运算符执行顺序,惰性求值

我不明白这个:

脚本: WORKDIR/sh/script.sh

[ -e filename ]          \
&& echo filename         \
|| [ -e ../filename ]    \
&& echo ../filename      \
|| { echo 'ERROR: failed to find "filename"' 1>&2 ; exit -1; }
Run Code Online (Sandbox Code Playgroud)

输出:

$ cd WORKDIR/sh
$ ./script.sh
../filename

$ cd WORKDIR
$ sh/script.sh
filename
../filename      # <---- WHY????
Run Code Online (Sandbox Code Playgroud)

我的想法:

1

[ -e filename ]          \ -> false
&&                         -> skip this, it is already false
   echo filename         \ -> don't even try
|| [ -e ../filename …
Run Code Online (Sandbox Code Playgroud)

bash

6
推荐指数
2
解决办法
662
查看次数

BASH:更改陷阱中的退出状态

我可以为陷阱处理程序中的 shell 脚本分配不同的退出状态吗?

通过反复试验,我发现调用exit退出trap状态是可以改变的。普通命令,无论失败还是成功,都不会改变退出状态。

现在我想知道,我是否可以依赖这种行为,或者这是一些实现怪癖?

我一直试图找到一些关于此的文档,但无济于事。

测试脚本:

#!/bin/bash
function handler {
    # a successful command won't change script exit status
    echo handler, status=$1
    # badcommand won't change script exit status
    #badcommand
    # exit will change script exit status
    #exit 23
}
trap 'handler $?' EXIT
#badcommand
Run Code Online (Sandbox Code Playgroud)

用法:

./trap_test.sh; echo status_out=$?
Run Code Online (Sandbox Code Playgroud)

bash trap exit-status

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

kill -9 后台作业也会杀死 bash

sleep 1 & kill -9 $?
Run Code Online (Sandbox Code Playgroud)

以上将杀死(最有可能)bash shell 或当前终端窗口。

这是为什么?


注意:sleep 1 & kill $?不会杀死外壳/终端。

只是为了确保我没有运行我认为不同的东西,有一些竞争条件等,以下也会产生相同的效果:

/bin/sleep 2 & pid=$?; sleep 1; kill -9 $pid
Run Code Online (Sandbox Code Playgroud)

GNU bash,版本 5.0.3(1)-release

bash kill background-process

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