请注意,我们从一个循环返回,该循环被重定向。
我不知道,我是否应该担心“文件”的写入缓冲区。
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”)被写入文件。
我想知道,如果这是一个非常糟糕的主意,为什么?或者它可能会在没有不可预见的竞争条件或类似条件的情况下工作?(但同样,我不想要像“这很糟糕,因为你应该使用这个和这个模式”这样的答案)
我不明白这个:
脚本: 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)
我的想法:
[ -e filename ] \ -> false
&& -> skip this, it is already false
echo filename \ -> don't even try
|| [ -e ../filename …Run Code Online (Sandbox Code Playgroud) 我可以为陷阱处理程序中的 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) 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