![将脚本通过管道传输到 shell 以避免锁定](https://linux22.com/image/212568/%E5%B0%86%E8%84%9A%E6%9C%AC%E9%80%9A%E8%BF%87%E7%AE%A1%E9%81%93%E4%BC%A0%E8%BE%93%E5%88%B0%20shell%20%E4%BB%A5%E9%81%BF%E5%85%8D%E9%94%81%E5%AE%9A.png)
我看到越来越多的项目设置说明涉及到wget
或curl
输出通过管道传输到 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.sh
和b.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
.