我正在编写一个使用 的脚本read -i
,因此它需要 Bash 4.0 或更新版本。
不幸的是,到 2020 年初,macOS 仍然附带 Bash 3.x,我的脚本的许多用户将使用 Mac。由于 Apple 已将默认 shell 更改为 zsh,因此我不希望他们更新捆绑版本。
因此,我希望我的脚本能够检测 Bash 是否足够新,然后退出并返回一条指导用户升级的有用错误消息。
我知道我可以比较${BASH_VERSION}
,但这是一个非数字格式的字符串,可能不可靠。对此做出假设感觉很脆弱。
实现这一目标的最佳方法是什么?
requireBash4() {
if <something here>; then
>&2 echo "Bash 4.0 or newer is required."
>&2 echo "Once you're upgraded, re-run this script."
exit 1
fi
}
Run Code Online (Sandbox Code Playgroud) 我需要使用 awk 从数组中在 CSV 文件中添加一列。
例如,
input.csv
a,10
b,11
Run Code Online (Sandbox Code Playgroud)
array = (100 200)
output.csv
应该看起来像
a,10,100
b,11,200
Run Code Online (Sandbox Code Playgroud)
我试过这个命令但它不起作用
awk -F"," 'BEGIN { OFS = "," } {for (x in array) $3=array[x]; print}' input.csv> output.csv
Run Code Online (Sandbox Code Playgroud) 是否可以效仿(这是正确的词吗?)以前版本的 Bash?
我使用的是 4.3.11,我很想知道我的脚本是否与某些早期版本兼容,但我不想实际安装早期版本。我可以翻阅更改日志并找出我正在使用的以前版本缺少的功能,但这似乎有点乏味。我希望有某种神奇的命令行选项或脚本命令(可能是一厢情愿)。
使用 bash 的 globstar ( **
) 运算符会导致内存不足错误吗?考虑这样的事情:
for f in /**/*; do printf '%s\n' "$f"; done
Run Code Online (Sandbox Code Playgroud)
何时**
用于生成大量文件列表,假设列表太大而无法放入内存,bash 会崩溃还是有处理此问题的机制?
我知道我已经运行**
了大量文件并且没有注意到问题,所以我假设 bash 将使用类似临时文件的东西来存储正在生成的一些列表。那是对的吗?bash 可以**
处理任意数量的文件,还是会在文件列表超出内存容量时失败?如果它不会失败,它使用什么机制来做到这一点?类似于sort
?生成的临时文件的东西。
假设我们有一个简单的管道:
set -eo pipefail;
echo 'foo' | cat
Run Code Online (Sandbox Code Playgroud)
怎么cat
知道什么时候退出?是在 STDIN 流结束时还是cat
接收到信号时?在我的例子中,生产者进程收到一个 SIGINT,然后以代码 1 退出,那么cat
(消费者进程)如何知道生产者进程以哪个退出代码退出?
我的计算机上有两个运行 Linux Mint 的硬盘。第一个是 SSD,有我的/
分区,第二个是 HDD,有我的/home
分区。
我听说对 SSD 写入太多是不好的,所以我尝试将/tmp
文件夹的位置移动到 HDD 上的某个位置。为此,我在该驱动器上创建了一个文件夹,将所有者授予 root,通过chmod
to设置权限1777
,然后运行
ln -s /tmp /new/location/tmp
Run Code Online (Sandbox Code Playgroud)
应用程序似乎正在使用新/tmp
文件夹,但该文件夹似乎不会在重新启动时清空自身。我已编辑/etc/default/rcS
设置TMPTIME=0
,但这似乎并不能解决问题。
我该如何解决这个问题?