将脚本通过管道传输到 shell 以避免锁定

将脚本通过管道传输到 shell 以避免锁定

我看到越来越多的项目设置说明涉及到wgetcurl输出通过管道传输到 shell 的情况。我想我第一次看到它是在 NVM 上。

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash

因此,这似乎是解决我遇到的一些问题(文件锁和权限)的简单解决方案,可以将脚本文件通过管道传输到 bash。

cat script.sh | bash

Bash 不是我的第一语言,我想知道这是否是禁止的,或者是否有更好的方法来解决我的问题。

(我的脚本从 git 存储库中提取最新版本,并在此过程中替换它的自身。或者至少应该这样做,但由于正在执行的脚本上的锁定,它不能这样做。否则,替换文件会擦除+x 标志,因此此解决方案检查所有框)

答案1

我认为,你的问题出在其他地方。没有锁定脚本来更改自身。

例如,您可以创建两个脚本a.shb.sh

#!/bin/sh
# a.sh
cp a.sh tmp.sh
cp b.sh a.sh
mv tmp.sh b.sh
echo A
#!/bin/sh
# b.sh
cp a.sh tmp.sh
cp b.sh a.sh
mv tmp.sh b.sh
echo B

现在你可以施展魔法了:

$ a.sh
A
$ a.sh
B
$ a.sh
A

在这种情况下,执行标志不会丢失。

通过管道传输脚本的唯一优点bash是,如果该命令创建了一个脚本,并且您不想将该脚本存储到实际文件中。在示例中,curl它下载install.sh并立即执行它。如果没有管道,那将是三行:

$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh >tmp.sh
$ bash tmp.sh
$ rm tmp.sh

管道从cat

$ cat script.sh | bash

在功能上与简单的bash script.sh.

相关内容