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