小编chi*_*cks的帖子

如何检测 Bash >=4.0?

我正在编写一个使用 的脚本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)

bash version

6
推荐指数
1
解决办法
760
查看次数

使用awk在CSV文件中添加列

我需要使用 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)

command-line awk text-processing

5
推荐指数
2
解决办法
5705
查看次数

是否可以模拟旧版本的 Bash?

是否可以效仿(这是正确的词吗?)以前版本的 Bash?

我使用的是 4.3.11,我很想知道我的脚本是否与某些早期版本兼容,但我不想实际安装早期版本。我可以翻阅更改日志并找出我正在使用的以前版本缺少的功能,但这似乎有点乏味。我希望有某种神奇的命令行选项或脚本命令(可能是一厢情愿)。

bash testing

5
推荐指数
2
解决办法
1505
查看次数

**(bash 的 globstar)会耗尽内存吗?

使用 bash 的 globstar ( **) 运算符会导致内存不足错误吗?考虑这样的事情:

for f in /**/*; do printf '%s\n' "$f"; done
Run Code Online (Sandbox Code Playgroud)

何时**用于生成大量文件列表,假设列表太大而无法放入内存,bash 会崩溃还是有处理此问题的机制?

我知道我已经运行**了大量文件并且没有注意到问题,所以我假设 bash 将使用类似临时文件的东西来存储正在生成的一些列表。那是对的吗?bash 可以**处理任意数量的文件,还是会在文件列表超出内存容量时失败?如果它不会失败,它使用什么机制来做到这一点?类似于sort?生成的临时文件的东西。

bash wildcards out-of-memory globstar

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

关闭消费者的正确方法

假设我们有一个简单的管道:

set -eo pipefail;
echo 'foo' | cat
Run Code Online (Sandbox Code Playgroud)

怎么cat知道什么时候退出?是在 STDIN 流结束时还是cat接收到信号时?在我的例子中,生产者进程收到一个 SIGINT,然后以代码 1 退出,那么cat(消费者进程)如何知道生产者进程以哪个退出代码退出?

shell bash pipe

4
推荐指数
1
解决办法
420
查看次数

将 /tmp 文件夹移动到不同位置。/tmp 未清空的问题

我的计算机上有两个运行 Linux Mint 的硬盘。第一个是 SSD,有我的/分区,第二个是 HDD,有我的/home分区。

我听说对 SSD 写入太多是不好的,所以我尝试将/tmp文件夹的位置移动到 HDD 上的某个位置。为此,我在该驱动器上创建了一个文件夹,将所有者授予 root,通过chmodto设置权限1777,然后运行

ln -s /tmp /new/location/tmp
Run Code Online (Sandbox Code Playgroud)

应用程序似乎正在使用新/tmp文件夹,但该文件夹似乎不会在重新启动时清空自身。我已编辑/etc/default/rcS设置TMPTIME=0,但这似乎并不能解决问题。

我该如何解决这个问题?

ssd tmp

3
推荐指数
1
解决办法
9513
查看次数