
我在開發某些應用程式時想知道(儘管這不是開發問題)cd
Windows 中使用的命令是否是通配符或跨平台命令。我查了一下 Unix/Linux 和 MAC OS X 的命令表,結果發現它似乎在那裡。我不是多作業系統用戶,所以我問是否有不同作業系統經驗的人可以告訴我:
- 如果這個命令真的存在並且有效
- 如果它具有相同的功能(更改目錄)
- 如果使用上有任何問題
- 如果在任何作業系統中都有另一個命令列命令可以以更好/更詳細/更常用的方式執行相同的操作。
先致謝!
(PSI 不能 100% 確定這個問題是否屬於這個網站或其他一些 stackexchange 網站......)
(PPS 任何標記此內容的幫助將不勝感激!)
答案1
如果這個命令真的存在並且有效
嗯,是的,它存在並且有效。
如果它具有相同的功能(更改目錄)
是的;是的,它確實。這並不是說某人不能簡單地創建一個程式(例如,cd.exe
)來執行其他操作,但它通常是內建在 shell 中並更改當前目錄的命令。
如果使用上有任何問題
什麼樣的問題?除了.
and之外..
,它的語法非常簡單。唯一的麻煩是更改其他磁碟區(磁碟機號)上的目前目錄時。此外,Windows 中的命令擴充功能稍微擴展了其使用範圍,但不會導致任何實際問題。
如果在任何作業系統中都有另一個命令列命令可以以更好/更詳細/更常用的方式執行相同的操作。
並不真地。還可以有其他指令,但是cd
很好、很短並且可以達到目的。除了更改目前磁碟機和目錄之外(例如cd /d t:\blah
),更改目前目錄究竟可以如何改進?
這不太切題(儘管它是相關的),但顯然有些人似乎無法接受該CD
命令不有被內置到外殼中。事實是確實如此不是;它能是一個外部程式。有些作業系統讓它變得容易,有些作業系統讓它變得困難,有些甚至可能讓它變得不可能,但事實是,它能是外部的並且不總是必須內置正如有些人想讓你相信的。例如,在包括 XP 和 7 在內的 32 位元版本的 Windows 上,您可以利用以下事實:控制台子系統(這是在 Windows 中支援和運行文字模式程式的方式)支援舊的「DOS」中斷 0x21 —是的,即使在cmd
,而不僅僅是“命令”中。 (它無法在 64 位元版本的 Windows 中運行,因為它們放棄了很多向後相容性。)
例如,您可以將下面的偵錯腳本儲存為c.scr
並透過從命令列運行來編譯它debug < c.scr
。它將建立一個.com
可用於更改目前目錄的檔案。
a
mov si,82
mov dl,[si]
or dl,20
sub dl,61
mov ah,e
int 21
mov dl,[si]
cmp dl,d
jz 119
inc si
jmp 10f
xor dl,dl
mov [si],dl
mov dx,82
mov ah,3b
int 21
mov ah,4c
int 21
n c.com
rcx
28
w
q
(注意,它不支援長檔名,因此您需要使用8.3版本。它也會更改當前驅動器,因此您可以一次性將目錄更改為另一個驅動器,但它以非常簡單的方式執行此操作,並且不執行任何錯誤檢查,因此嘗試更改為以驅動器存在的字母將不起作用。也就是說,c c:\windows
將按預期工作c \windows
,但c asd
如果您有驅動器,則不會工作A:
,除非它恰好包含名為 的目錄asd
。如果您願意,您可以擴展它並添加錯誤檢查等,但這證明了我關於在 Windows 中成為外部的可能性的觀點cd
。
您也可以儲存以下 Pascal 程式(例如,作為c.pas
)並使用 Turbo Pascal 或 GO32 版本的 FreePascal 編譯器進行編譯(32 位元版本無法運作,因為它使用普通的 Windows API):
program cd;
begin
chdir(paramstr(1));
end.
再次,只需運行它來更改當前目錄(例如,`c.exe "c:\program files" - 是的,長資料夾名稱可以工作,但在執行時會自動轉換為 8.3 名稱)。
答案2
更改目錄命令的想法是1969cd
年作為 Unix 的一部分發明的。它也與作為 Unix 的一部分發明的樹形結構檔案系統相匹配,在該系統中,甚至設備也是.人們很容易忘記,在 Unix 之前,沒有太多作業系統具有樹形結構檔案系統以及普通使用者可以輕鬆建立的目錄。通常,您(充其量)只是在某個地方得到一堆文件,並使用 IEBGENER 等奇怪的 IBM 實用程式來操作它。ls
rm
sed
/dev
所做cd
的就是更改目前進程的目前目錄(在本例中為 shell),這會影響作業系統如何解釋相對檔名,也就是那些從/
檔案系統根開始不完全限定的檔案名稱。目前目錄是從父進程繼承到子進程的。
cd
Unix 或 Linux 系統與 Windows 系統的語意存在一些很大的差異。一是,cd
沒有操作數該做什麼?在 Unix 或 Linux 上,它會將您帶到主目錄。在 Windows 上,cmd.exe
'scd
只是報告當前目錄。此外,Windows 不是單根的,它有磁碟機號,並且每個進程上都可以有一個當前目錄,儘管幕後實作是 Microsoft 將其扔到應用程式空間中:每個進程都帶有一些隱藏的環境具有奇怪名稱的變量,例如=C:
應用程式負責保持最新的變數。
有些cd
命令比其他命令更好,但這可能是品味問題。這C殼CDPATH
引入了與變數類似的想法PATH
,但尋找目錄而不是可執行檔。 C shell 還引入了目錄堆疊,讓您可以存取pushd
目前popd
目錄。書面我自己的C shell我複製了所有這些,添加了一個選項,讓用戶決定cd
在沒有操作數的情況下應該做什麼,以及客戶建議的一個功能,如果您輸入超過 2 個點,則cd ....
應該上升 n-1 級。
答案3
是的,cd
是一個可在 Linux、OSX 和其他 *nix 作業系統上運行的 *nix 指令。
答案4
DOS 和 Windows 中的命令cd
與 Unix/Linux 中的命令非常相似,並且有充分的理由:目錄的整個概念是從 Unix 複製的。
第一個運行 MS-DOS(品牌為 PC-DOS)的系統是 IBM PC。沒有硬碟——儲存在軟碟上,軟碟有 180K 和 360K 容量。對於如此有限的媒體,您不需要複雜的檔案命名方案。因此,完全限定的檔案名稱只是一個磁碟機指示符,後面跟著一個8.3 檔案名例如a:autoexec.bat
或b:advent.exe
。
MS-DOS 2.0 試圖透過複製 Unix 的功能來解決許多類似的問題。這包括目錄和處理它們的命令。一個問題是 MS-DOS 已經使用 / 字元來指示可選參數;這就是 Windows 和 Unix 使用不同路徑分隔符號的原因。
一個重要的差異是 Unix 有一個統一的目錄層次結構,沒有磁碟機指示符。在將該cd
命令適應 MS-DOS 時,微軟必須為「目前目錄」的概念發明新的語義,並將磁碟機指示符考慮在內。為了最大化向後相容性(以便類似的名稱a:something
仍然有意義),他們發明了「當前磁碟機」的概念,並規定每個磁碟機都有自己的「目前目錄」。因此,當您變更“目前目錄”時,您實際上是在變更目前磁碟機的目前目錄。通常這種細節不必擔心。但這確實解釋了為什麼當你開機c:\somedir
並且你不做任何事情時cd d:\otherdir
似乎什麼也沒有發生。什麼有發生的情況是您更改了d:
磁碟機的目前目錄,但沒有更改目前磁碟機;您必須輸入d:
命令才能發生這種情況。