我继承了一些 bash 脚本,其中作者在函数名称中使用了“-”而不是更普通的“_”,例如:
function a-b {
...
}
Run Code Online (Sandbox Code Playgroud)
在 bash 中丑陋但合法。问题是我在一个暴发户脚本中找到了这个并得到了
x.sh:第 5 行:`a-b':不是有效标识符
花了一段时间才意识到这是名称而不是函数内容。无论如何,在这种情况下重命名不是一个简单的选择,据我所知,暴发户使用/bin/sh
not/bin/bash
解析?运行它的脚本。因此我猜这个问题。
除了重命名之外,还有其他解决方法的想法吗?
如果不出意外,至少我希望这个问题能警告其他人奇怪的 bash 编码风格的危险,以及它们有时如何反咬你。
我想生成一个进程并在顶层运行它,这样当 shell 退出时,进程继续运行。
我错误地认为 nohup 会这样做,但是当我退出 shell(shell 是一个 lxc 容器,我 ssh 进入该容器)并重新进入时,该过程消失了。
似乎(查看 pstree)该进程仍在调用 shell 下,即使使用 nohup 或 disown。
我尝试了一些选项,setsid 似乎有效 - 但是我在这里用 nohup 做错了吗?
$ cat myproc
sleep 1234
$ myproc &
$ pstree -a | grep -B 3 "1234" | grep -v grep
|-screen
| |-bash -ls
| | |-bash -ls
| | | `-sleep 1234
$ nohup myproc &
$ pstree
|-screen
| |-bash -ls
| | |-pstree -a
| | `-sh ./myproc
| | `-sleep 1234 …
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种更简单的方法来进行跨操作系统的 unix 文件大小检查。我可以使用 wc -c 但我担心大文件的性能可能会很差(我假设它只计算字符并且不做统计?)
以下适用于 linux 和 macos(可能是 bsd)。有没有更简单的表现良好的方法?
function filesize
{
local file=$1
size=`stat -c %s $file 2>/dev/null` # linux
if [ $? -eq 0 ]; then
echo $size
return 0
fi
eval $(stat -s $file) # macos
if [ $? -eq 0 ]; then
echo $st_size
return 0
fi
echo 0
return -1
}
Run Code Online (Sandbox Code Playgroud)