有時候我會看到很少的腳本通過「sh」命令執行,有時通過「./」命令執行。我無法理解它們之間的確切區別。請幫幫我 。UNIX中「./」和「sh」之間的區別
6
A
回答
11
sh file
執行一個新的shell進程shell腳本文件。
. file
在當前shell進程中執行shell腳本文件。
./file
將執行當前目錄中的文件。該文件可以是二進制可執行文件,也可以以hashbang行開頭(文件的第一行的格式爲#!....
,例如文件中的#!/usr/bin/ruby
表示該腳本需要作爲Ruby文件執行)。該文件需要設置可執行標誌。
例如,如果您有腳本test.sh
:
#!/bin/sh
TEST=present
和你sh test.sh
執行它,你會推出一個新的sh
(或者說bash
,最有可能的,因爲一個是softlinked到現代系統中的另一個),然後在其中定義一個新變量,然後退出。隨後的echo $TEST
會打印一個空行 - 該變量未在外殼中設置。
如果您使用. test.sh
啓動它,則需要使用當前shell執行該腳本。 echo $TEST
的結果將打印present
。
如果您在使用./test.sh
啓動它,第一行#!/bin/sh
將被檢測到,那麼這將是完全一樣,如果你寫/bin/sh ./test.sh
,在這種情況下,可以歸結爲第一個場景。但是,如果hashbang行是例如#!/usr/bin/perl -w
,則該文件將被執行/usr/bin/perl -w ./test.sh
。
6
在簡單的話,sh file1
執行sh命令/可執行與file1的作爲參數。在這種情況下,當sh可執行文件讀取並攔截文件中的命令時,file1不需要執行權限。
./file1
它只是運行/執行可執行文件file1,因此它需要可執行權限。在這種情況下,它會在shebang #!/bin/sh
中提到的shell上執行,如果它沒有在當前shell中提及它。
希望藉助上述內容不亂:)
相關問題
- 1. #!/ bin/sh和#之間的區別:/ bin/sh
- 2. 「sh -c cmd」和「cmd」之間的區別?
- 3. root shell「#」和「sh-4.2#」之間的Linux區別
- 4. unix系統中的python - getmtime()和getctime()之間的區別
- 5. unix中的nice和setpriority之間的區別
- 6. Unix中的作業和進程之間有什麼區別?
- 7. UNIX中進程組ID和作業ID之間的區別
- 8. unix中共享內存和管道之間的區別?
- 9. python tcp socketserver和windows和unix客戶端之間的區別
- 10. 舊的和新的Unix編譯器之間的區別?
- 11. 之間的〜/和的區別../
- 12. '#','%'和'$'之間的區別
- 13. {!!之間的區別!!}和{{}}
- 14. '+ ='和'= +'之間的區別?
- 15. 「。+」和「。+?」之間的區別
- 16. .eq之間的區別。和==
- 17. #。/和#之間的區別。 ./
- 18. !=和!之間的區別==
- 19. 「%〜dp0」和「。\」之間的區別?
- 20. | =和^ = css之間的區別
- 21. 之間的區別。和#
- 22. ==和case之間的區別?
- 23. 「**/* /」和「** /」之間的區別?
- 24. jQuery - '。'之間的區別和「#」
- 25. 「?1」和「?」之間的區別
- 26. `%in%`和`==`之間的區別
- 27. fmod和%之間的區別
- 28. 之間的區別:+和:+
- 29. cat和fold unix命令之間的區別
- 30. Windows select和Unix之間的區別select for nonblocking sockets
非常感謝。雖然我能夠通過./運行.sh文件,但沒有提到hashbang這一行。怎麼可能呢? –
如果沒有hashbang行,'bash'會認爲它是一個shell腳本文件。如果你想使用任何其他解釋器,你確實需要一個hashbang。 – Amadan
再次感謝:) –