2013-01-24 18 views
2

在典型的Linux shell中,可以使用Ctrl+c停止執行命令。如果您已經開始使用通配符(例如*)來查找具有特定模式的所有文件的運行,並且如果您有許多文件需要搜索,則shell可能需要相當長的時間才能將通配符展開爲實際的文件名稱。同時Ctrl + c不會停止shell。殼牌繼續解決通配符問題。只有在shell解析通配符後,Ctrl + c纔會生效,並且可以花費相當多的時間。在解析(即擴展)通配符時停止Linux shell

有沒有辦法在試圖擴展通配符時停止shell?

這在GNU bash, version 4.1.5(1)-release (x86_64-pc-linux-gnu)上測試。

+0

你總是可以背景它,然後殺死這個過程... – Nate

+0

這是一個錯誤報告給這個shell的維護者。它*應該*字段'SIGINT'(或者檢測控制-C,如果它將終端置於原始模式)並中止通配符擴展。 – zwol

+1

我不能在Bash 4.2.24(1)中重現這一點。 Ctrl-c迅速殺死'echo **/*',因爲它正在破壞磁盤。 –

回答

1

我想你可以殺死這個過程。 Ctrl-z停止,ps aux | grep processname,獲取進程ID,然後kill processid

+0

當發生這種情況時,Ctrl-z似乎不起作用。所以,我甚至無法阻止它。 – stacksia

2

如果shell似乎需要非常長的擴大通配符,您很有可能有其中的一個事情:

  1. 你正在做的事情一樣*/*/*/*/*/* - 解決方案:不這樣做;找到一種方法將你正在做的事分解成更小的比特,或者至少更有效地處理它
  2. 你在目錄中有大量文件 - 解決方案:不這樣做;在一個目錄中有太多文件是許多文件系統上衆所周知的性能殺手(儘管有些文件系統比其他文件系統更好處理)
  3. 您的文件系統可能是網絡文件系統(NFS,Samba/CIFS,sshfs等) ..)在有點慢的網絡鏈接上,或者在像CD/DVD之類的慢物理介質上。除了一次只匹配較少的文件,或者等待它,這裏沒有太多要做。
  4. 您的文件系統通常很快,但它位於一個老化的硬盤驅動器上,該驅動器開始出現讀/寫錯誤,導致嘗試重新定位扇區,這看起來像是大量超時。檢查您的系統日誌中是否有可怕的磁盤信息,如果是這種情況,請購買新磁盤並在昨天將您的數據移動到它。
  5. 可能有其他...

在此期間,其他建議/評論/答案指向如果出現掛殺死你的shell的能力。