2014-04-09 103 views
4

我的前身在我繼承的舊機器(運行Linux)上安裝了一些蹩腳的軟件。所有這些蹩腳的軟件都安裝在各處,而且也很臃腫,我希望它儘快離開 - 自從我們轉向更好的軟件以來,它不再具有任何功能性用途。幹運行有潛在危險的腳本?

供應商提供了一個卸載腳本。不信任蹩腳的軟件,我在編輯器中(一200 +線巴什怪物)打開卸載腳本,並開始了這樣的事情:

SWROOT=`cat /etc/vendor/path.conf` 
... 
rm -rf $SWROOT/bin 
... 

事實證明,/etc/vendor/path.conf丟失。不知道爲什麼,不知道如何,但它是。如果我已經運行了這個可愛的小腳本,它會刪除/bin文件夾,這會有相當有趣的含義。當然這個腳本需要root才能運行!

我已經處理了這個問題,只需手動運行所有安裝命令(guh),在哪裏合理。這種吸入是因爲我不得不手動插入所有命令。一般來說,有沒有某種方式可以「幹運行」一個腳本,以便將它執行的所有命令轉儲出去,而不會實際執行它們?

+2

不,'bash'不提供任何_dry run_功能。 – devnull

+0

製作例如一個Python腳本,使每行「echo」行「'。然後運行它。 – Pietu1998

+0

有沒有另外一個shell? –

回答

7

您可以嘗試在Kornshell下運行腳本。當您使用ksh -D執行腳本時,它會讀取命令並檢查它們的語法,但不會執行它們。把它和set -xv結合起來,你就會打印出將要執行的命令。

您也可以使用set -n來達到同樣的效果。 Kornshell和BASH相互兼容。如果它是純Bourne shell腳本,Kornshell和BASH都會執行它幾乎相同的操作。

您也可以運行ksh -u這會導致未設置的shell變量導致腳本失敗。但是,這不會抓住一個不存在的文件的貓咪貓。在那種情況下,shell變量被設置。它被設置爲空。

當然,您也可以在受限制的shell下運行該腳本,但這可能不會卸載該軟件包。

這是你可以做的最好的。

+0

哦,非常好!我從來沒有使用過'ksh',但看起來這是研究這個問題的好時機。 –

+0

事實上,大約20年前,考察Kornshell的好時機已經過去了。 Kornshell是基於Bourne shell語法的第一個*超級shell *。 Kornshell 88(如1988年)是第一個主要版本。 Kornshell由AT&T擁有,原本不是開源的(儘管免費)。然後,它成爲開放源碼的CPL許可證,與GPL許可證不兼容,因此與Linux和GNU不兼容。 (不要讓我開始關於_license戰爭_。)但是,有幾個很好的KSH功能從未將它加入到BASH中,而* run-run *就是其中之一。 –

+0

雖然'-D' _implies_'-n',它用於不同的目的。在'bash'和'zsh'中也支持'-n'進行語法檢查。將'-x'添加到'-n'完全沒有好處,因爲 - 在設計上 - 什麼都沒有_executed_。 增加'-v'提供了_may_提供了一個_limited_好處:它將打印源代碼直到出現語法錯誤(如果有的話) - 否則它實際上只是腳本的「貓」。也就是說,'-n'總是打印出有問題的行號。 簡而言之:無需執行幹運行功能,無需執行語法檢查即可獲得 - 無論是在「bash」,「ksh」還是「zsh」中。 – mklement0

1

bash報價空轉功能(既不做kshzsh,或任何其他的shell我知道)。

在我看來,這在shell提供這樣的功能是幾乎不可能:狀態變化必須是模擬任何命令調用 - 無論是內置或外置 - 就必須要知道的這些模擬。

最接近的事是bashkshzsh報價是通過選件語法檢查腳本但不執行,能力-n

bash -n someScript # syntax-check a script, without executing it. 
  • 如果有沒有語法錯誤,將不會有輸出,並且退出代碼將爲0.
  • 如果存在語法錯誤,則分析是將在第一錯誤停止,包括行號的錯誤消息寫入stderr,並退出代碼將是:
    • 2bash
    • 3ksh
    • 1zsh

另外,bashksh,和zsh提供調試選項

  • -v打印每個原始源代碼行[1] 在執行之前到stderr。

  • -x打印每個擴展簡單的命令在執行之前到stderr(ENV。變種PS4允許調整輸出格式)。


結合-n-v和/或-x提供一點好處:

  • 如果指定-n-x沒有任何效果可言,因爲什麼都沒有執行

  • 隨着-n指定,-v將有效簡單地打印的源代碼。

    • 如果存在一個語法錯誤,有可能在源代碼中獲取打印到其中誤差發生點好處;請記住,儘管由
      -n產生的錯誤信息始終包含有問題的行號。

[1] 通常,它是單獨的被打印出來,但真正的單元然而許多行給定的命令 - 其可以是化合物命令如while或命令列表(例如管道) - 跨度。