我的前任在我继承的旧机器(运行Linux)上安装了一个糟糕的软件。这个蹩脚的软件安装了整个地方的flotsam,并且还充分膨胀,我希望它尽快消失 - 它已经不再有任何功能目的,因为我们已经转向更好的软件。
供应商提供了卸载脚本。我不相信这个糟糕的软件,我在一个编辑器(一个200多行的Bash怪物)中打开了卸载脚本,它开始是这样的:
SWROOT=`cat /etc/vendor/path.conf`
...
rm -rf $SWROOT/bin
...
事实证明/etc/vendor/path.conf
缺失。不知道为什么,不知道怎么样,但确实如此。如果我运行了这个可爱的小脚本,它就会删除/bin
文件夹,这会产生相当有趣的含义。当然这个脚本需要运行root
!
我通过手动运行所有安装命令(guh)来处理这个问题。这种情况很糟糕,因为我不得不手动插入所有命令。一般来说,是否有某种方法可以“干运”一个脚本,让它转储出 执行的所有命令,而不是实际执行它们?
答案 0 :(得分:8)
您可以尝试在Kornshell下运行该脚本。当您使用ksh -D
执行脚本时,它会读取命令并检查它们的语法,但不会执行它们。将其与set -xv
组合,您将打印出将要执行的命令。
您也可以使用set -n
获得相同的效果。 Kornshell和BASH相互兼容。如果它是一个纯粹的Bourne shell脚本,Kornshell和BASH都会执行它几乎相同。
您还可以运行ksh -u
,这将导致未设置的shell变量导致脚本失败。但是,这不会抓住一个不存在的文件的无猫。在这种情况下,设置了shell变量。它被设置为null。
当然,您也可以在受限制的shell下运行该脚本,但这可能不会卸载该软件包。
这是你可能做的最好的事情。
答案 1 :(得分:4)
bash
不提供干运行功能(ksh
,zsh
或任何其他shell都不是知道)。
在我看来,在shell中提供这样的功能几乎是不可能的:状态更改必须是模拟并调用任何命令 - 无论是否内置或外部 - 必须知道这些模拟。
bash
,ksh
和zsh
提供的最接近的内容是 语法检查脚本的能力执行它,通过选项-n
:
bash -n someScript # syntax-check a script, without executing it.
2
bash
在3
ksh
在1
zsh
另外,bash
,ksh
和zsh
提供调试选项:
-v
打印每个原始源代码行 [1]
在执行之前到stderr。
-x
在执行之前将每个扩展的简单命令打印到stderr(env.var。PS4
允许调整输出格式)。
将-n
与-v
和/或-x
相结合几乎没有任何好处:
如果指定-n
,则-x
完全没有效果,因为已执行 。
指定-n
后,-v
将有效地打印源代码。
-n
始终包含有问题的行号。 [1] 通常,它是打印的单个行,但是真正的单位是给定命令的许多行 - 可能是一个复合命令如while
或命令列表(如管道) - 跨度。