為何 Linux 或 PowerShell 中執行指令碼需新增 ?

時間 2021-05-30 04:39:59

1樓:Doraemon

Powershell 的我不知道,就說 Linux 的吧。

Windows 的 cmd 執行當前目錄下的可執行檔案時不需要加 ./ 或者 .\,這就出現乙個問題,那就是如果當前目錄下有和環境變數 PATH 目錄下的可執行檔案重名的檔案時會產生衝突。

假如某目錄下有個 shutdown.exe 的檔案,那麼你在該目錄下執行 shutdown 命令時執行的其實是當前目錄下的那個 shutdown.exe,而不是預期的關機行為。

Linux 為了防止這種可能的衝突,強制規定,執行非環境變數 PATH 下的可執行程式時,必須指明程式所在目錄。不帶目錄的命令就認為是在 PATH 裡的命令。

2樓:

Unix 最早也是不需要加的,但是因為這有嚴重安全隱患,後來就改成必須加了(除非你主動把 . 加到 PATH)。

要知道 Unix 從一開始就是多使用者系統,使用者之間的許可權控制是很重要的一塊。如果預設先搜尋當前目錄,我只要在在公共目錄下(比如 /tmp)放乙個惡意的 ls,其他人到那目錄下執行 ls 就全部中招。

至於 DOS,它本來就是每個程式都掌握系統最高許可權的設計,當然不需要考慮什麼安全。

3樓:氤氳之端

加./只在一種情況才會用到。就是你要執行的命令在你當前目錄下的某個目錄。也就是說./表示當前目錄。同理,../表示當前目錄的上級目錄。

./cmd 表示說執行當前目錄下名叫cmd的命令

4樓:「已登出」

因為./不在path裡

當你執行命令的時候,這個命令有可能是乙個內建命令,或是乙個可執行檔案,而在你沒有給定檔案路徑的情況下,就認為你通過環境變數給出了路徑,這是很自然的,而至於你想不想在當前目錄下找,shell並不知道,那麼如果你指定的路徑不包含當前路徑,shell自然就不會去找。

所以如果你想要少打兩個字元的話,把.加進path就好了。

5樓:英俊的鳳姐姐

你在bash上打上,llk.py

你以為系統僅僅是返回報錯?找不到檔案?人家跑去PATH找了一大輪才告訴你的。

./llk.py,是告訴系統,在當前目錄找乙個llk.py的檔案,找到就執行他,而不是跑去PATH找。

6樓:劉浩浩

./要做的唯一的事情就是告訴系統,後面要執行的你在當前目錄找就可以了,找不到就給我報錯

如果不加,就是告訴系統,你到環境變數PATH的那些路徑下乙個個找,找不到就給我報錯

題主你把當前路徑放到環境變數PATH,你就會發現不要./也執行你的指令碼或者二進位制可執行程式啦

建議題主多多看書學習

7樓:旅行者

因為當你輸入乙個命令的時候,是先在環境變數PATH中搜尋對應的程式,然後才在當前目錄找。

而輸入./就相當於告訴shell路徑了,就不需要搜尋了。

8樓:

./,或者bash的方式開啟指令碼或程式,其實是另開乙個子shell執行,我們原來敲命令的那個shell是父shell,子shell可以繼承父shell的環境變數,但子shell設定的變數,除非用export命令,在子shell退出時,是不會生效的,也就不會影響父shell的環境變數

9樓:瘦猴

./表示當前目錄,linux預設搜尋目錄裡沒有當前目錄,在當前目錄需要執行程式就要加上路徑./ 用絕對路徑代替也是可以的

10樓:

應該是根據「不要給使用者驚喜」的原則設計出來的。要顯式的把乙個目錄加到搜尋路徑裡才可以,不然當前目錄下有乙個名為ls的程式,某些shell script就不work了。

11樓:

安全原因。如果沒有這種機制,你執行cp,當前目錄下也放了乙個檔案名叫cp的可執行檔案,而這剛好是個惡意軟體,那就GG了。

12樓:慄悟飯和龜波氣功

因為你執行可執行檔案的時候,shell會從環境變數PATH裡面找這個檔案,但是如果你沒有把這個目錄新增進環境變數裡面自然找不到你的檔案了,所以要用./告訴系統執行檔案的位置。

13樓:Ivony

這就是個習慣的問題,不要扯那麼多。DOS的搜尋規則是先搜尋當前資料夾,其他的CLI不這樣設計。

其實,Powershell有個叫做Get-Command的CmdLet可以用來找出任何你執行的指令到底是什麼東西,Linux下好像沒發現類似的系統指令。(答案:which)

14樓:

我不知道 Linux 的情況,不過我聽說有問題先找男人(man 命令)。

PowerShell 的幫助系統已經解釋得很明確了:

Suggestion [3,General]: The command was not found, but does exist in the current location. Windows PowerShell does not load commands from the current location by default.

If you trust this command, instead type: ".\".

See "get-help about_Command_Precedence" for more details.

以及-- If you specify the path to a command, Windows PowerShell runs the

command at the location specified by the path.

For example, the following command runs the FindDocs.ps1

script in the C:\TechDocs directoryC:\TechDocs\FindDocs.ps1

As a security feature, Windows PowerShell does not run executable

(native) commands, including Windows PowerShell scripts, unless the

command is located in a path that is listed in the Path environment

variable ($env:path) or unless you specify the path to the script

file.

To run a script that is in the current directory, specify the full

path, or type a dot (.) to represent the current directory.

For example, to run the FindDocs.ps1 file in the current directory,

typeFindDocs.ps1

15樓:白小雨

因為指令碼作為可執行檔案的時候是當作指令而非物件的,而Linux對於指令的優先順序是:

1. 絕對/相對路徑(要是不加./xx或者/xx/xx就會跳到下面第二條開始找)

2. alias

3. builtin

4. $PATH

16樓:jun4rui

如果把檔案目錄比喻成房間,那麼每個房間裡面有n個人(對應n個檔案),如果每個房間裡面都有乙個叫「小明」的人,我怎麼確定我喊「小明」,出來的是我要的哪個呢?

所以作業系統需要靠路徑來明確指出,我要找的是A房間的小明。

至於你平時可以在任何地方叫「小明」,會蹦出來的那個,是系統自動設定在PATH對應房間裡面的「小明」,這個環境變數儲存的是乙個房間號,確保你在任何地方都可以召喚到,所以系統常見的命令都會放在這裡。

而如果你要召喚其它「小明」,或者「小張」、「小李」,統統都需要+房間號,這才是合理的機制。

所以,你需要輸入"./"召喚當前房間的小明,或者"/usr/bin"召喚其它房間的小明。

至於為什麼不預設"./",有安全的原因也有歷史習慣。

順便說乙個題外話,以前DOS下可執行檔案有.com和.exe,而.

com的優先順序比.exe高。所以有些病毒或者惡意檔案或者開玩笑的人,就把系統命令做乙個同名的.

com放在系統變數PATH目錄下……

17樓:李嘉圖

就是這樣設計的,因為防止當前目錄有些病毒程式的偽裝,比如當前目錄正好有個病毒偽裝的ls,你一旦在這個目錄執行ls,就會中毒,但是如果你加了./,情況就會好很多

在一些敏感的場合,甚至執行命令必須用絕對路徑,加./是為了安全

18樓:jiangtao9999

因為不新增,那麼直譯器就會到固定的位置裡面尋找東西,而不是在當前目錄下。

Linux 下面 bash 這個位置靠的是變數 PATH 。

我印象裡,可以給 PATH 變數附加設定 ./ ,讓直譯器在當前目錄尋找。

為何強調Linux下程式設計

不喜歡IDE的表示 cmd用起來太酸爽了.notepad用起來太酸爽了.鬧得我只好用msys 可惜不是給寫程式的設計的 我一直使用windows並從事程式設計工作,遺憾的是從來沒用過VS,因為我寫的程式都是執行在linux上的。我嘗試過在windows上用cygwin mingw等安裝python的...

Linux 為何不把圖形使用者介面寫入核心?

1。linux核心只放最基本的東西,這是設計者的理念問題 2。沒有公司去推動 就這兩點原因,那些扯什麼技術原因更種高深原因的,你解釋一下為啥windows就把圖形介面寫進了核心? Linux核心沒有介面庫是因為linux核心是免費開源的,既然沒有人能從中獲利,並且使用linux都是黑客,根本不需要玩...

使用MAC或LINUX能否很好的從事嵌入式開發工作?

我用的mbp,另帶了乙個可攜式工控機,無屏無滑鼠的那種,跑的debian,當乙個小伺服器用。平時通過ssh ftp nfs這些來交叉編譯等。至於燒寫,我主要做的是linux端的開發,這種要麼直接走的是sd卡 要麼提供linux端的燒寫驅動 要麼走的是標準協議,而且基本上只燒一次就夠了,後面都走的是乙...