2015-10-13 62 views
8

我看到這一切的時候在我工作的地方:爲什麼腳本在變量中定義常用命令?

#!/bin/sh 

..... 

CAT=/usr/bin/cat         # An alias for cat 
MAIL=/usr/bin/mail        # An alias for mail 
WC=/usr/bin/wc         # An alias for word count 
GREP=/usr/bin/grep        # An alias for grep 
DIRNAME=/usr/bin/dirname       # An alias for dirname 
RM=/usr/bin/rm         # An alias for rm 
MV=/usr/bin/mv         # An alias for mv 

..... 

難道只是我的公司做這個?是否有理由說明這些非常常見的命令在哪裏?爲什麼我需要$CAT參考/usr/bin/catcat已經指/usr/bin/cat?我錯過了什麼嗎?這似乎是不必要的多餘。

回答

12

使用完整路徑名可確保腳本正常運行,即使它由定製其環境變量的用戶運行,以便它找到不同於腳本期望的這些命令的不同版本。

使用變量簡化了腳本的編寫,因此您不必在每次出現腳本時都寫入命令的完整路徑名。

+0

謝謝!我知道這背後肯定有一些原因。 – R4F6

4

這只是我的公司嗎?

是否有一個原因,你想拼出這些地方極其常見的命令?

是。

我爲什麼要$CAT指到/ usr /斌/貓當cat已經指/usr/bin/cat

肯定cat總是指/usr/bin/cat?如果你的腳本碰巧在路徑前面有一個不同的cat的環境中運行,該怎麼辦?或者,在路徑的早期只有一個用戶控制的目錄,用戶可以在其中安裝流氓cat命令?如果您的腳本恰好以高權限運行,那麼您是否真的想讓隨機用戶能夠對系統執行任何操作?

你確定cat應該是總是指/usr/bin/cat?如果腳本安裝在需要不同cat(例如/usr/local/bin/gnucat)的環境中,那麼您是否希望修改一行或二十行?

我錯過了什麼嗎?這似乎是不必要的多餘。

是的,你錯過了一些東西。

一想避免寫出/usr/bin/cat,到處都需要運行cat,和一個希望能夠選擇不同的cat在需要的地方(或更可能是不同的makegrepsed)。另一方面,人們希望避免可信腳本行爲的潛在不安全外部影響。在shell變量中定義命令的完整路徑,然後使用該變量運行命令即可實現這些目標。要避免這種情況,仍然有忽視用戶環境的安全

+0

我使用的最常見事件是通過cron作業運行腳本,其中PATH與USER或root不同。硬編碼路徑消除了這個問題。約翰是絕對正確的,你不能指望你假設存在的路徑,所以這是一個很好的實踐,或者,作爲另一個答案,設置PATH,但是在讀取代碼方面並不明顯馬路。設置這樣的路徑也可以讓你根據環境使用替代路徑,例如在BSD或GNU/Linux中。 – Lizardx

+1

你對PATH是正確的,但別名是不相關的。別名不會被繼承,並且它們不會在腳本中擴展,除非腳本專門啓用它們。 – Barmar

+0

@Barmar,謝謝,糾正。 –

3

的方法之一是明確地闡明腳本變量

#!/bin/sh 

PATH=/bin:/usr/bin # maybe you need something in /usr/sbin, add that 
LC_ALL=C    # ignore the user's locale 
LD_LIBRARY_PATH=something # or unset it if you want nothing 

# then 
cat /a/file   # have confidence you're using /bin/cat 

有可能是別人:檢查程序的手冊頁你在你的代碼中使用。

+1

可能不是一個現實的問題,但自定義路徑不適合使用,例如'/ usr/bin/cat'而不是'/ bin/cat'。 – chepner