bash 中的 $_ 与破折号脚本

$_ in bash vs. dash scripts

我需要将一个简短的脚本从 bash 移植到 dash(即 Debian 10 下的 sh)。它包含以下行:

chown root:www-data /etc/nginx/conf.d && chmod 775 $_

这现在失败了,因为 $_ 使用 bash 保存了前一个命令的最后一个参数(即 /etc/nginx/conf.d),但现在使用非交互式 dash 保存了一个不同的值。作为另一个例子,bash -c 'echo 1 2 && echo $_'dash -c 'echo 1 2 && echo $_' 的输出也不同。

dash 中形成上述类型的“简洁”语句的典型方法是什么(不求助于更专业的命令,例如 install)?

随便写一个函数。

chownmod () { chown "" "" && chmod "" ""; }

并用以下内容替换该行。

chownmod root:www-data 775 /etc/nginx/conf.d

只需定义一个显式变量来保存目录名称。

d=/etc/nginx/conf.d
chown root:www-data "$d" && chmod 755 "$d"

$_ 旨在用作交互式快捷方式。在编辑器的帮助下编写的脚本实际上并不需要这样的快捷方式。