PowerShell與Linux Shell有什麼不同?


Shell是LINUX系統的用戶界面,提供了用戶與內核進行交互操作的一種介面。它接收用戶輸入的命令並把它送入內核去執行。實際上Shell是一個命令解釋器,它解釋由用戶輸入的命令並且把它們送到內核。

Windows PowerShell 是WINOWS一種命令行外殼程序和腳本環境,使命令行用戶和腳本編寫者可以利用 .NET Framework的強大功能。微軟這次沒有低調,強硬的命名它為PowerShell ,看樣子想在SHELL界面里打敗BASH。

一、理念論

從理念上 ps 比 bash 先進一代,ps 有完整的、強類型的編程支持,bash 裡面全是字元串。Powershell 裡面很多的函數比 UNIX 更加正交,如 % 和 ?,可以提供極其可怕的抽象能力,你 bash 就是做不到。

不過針對理念這一說法,也有人提:說PS的OOP理念比shell純字元串先進的同學請想一想:JavaScript的對象字面量,是用字元串表示對象,這樣的一種技術為什麼大受歡迎?答案是從使用者友好的角度看,字元串要優於對象,而命令行恰恰是人機交互界面,這就是為什麼shell比PS易用的原因,至於比較「理念」哪個先進,對於靠代碼吃飯的人來說就是扯淡。

二、用法論

1、bash 快,易用,提示好,難學。寫 script,看 script 的時候你想砸電腦。ps 寫的 script 清晰,好讀,有一點編程基礎,就算幾乎沒學過 powershell 都能猜出來啥是幹嘛的,但是比較慢。。。所以說平常交互的話 bash(bash-it, oh-my-git, oh-my-zsh)更好用一些,但是真正寫起 script 的時候感覺還是 powershell 爽。

2、如果你受夠了bash靠文本解析和環境變數來解決邏輯問題,你會無比渴望一個OO的Shell。——PS簡直是大救星。隨著PS用多了,你會發現,PS的OO有些走火入魔,你又會開始懷念簡單粗暴的bash。

三、技術論

這個不是一兩句話能說清楚的。PS包含了BASH很多命令了,甚至我看有想法把BASH所有的命令都移到WIN下,讓BASH成為它的一個子集。不過也有人指出肯定是GNU Bash好呀,畢竟Bash作為大量Linux發行版默認的Shell,久經考驗。如果兩個具休技術細節比較的話,需要長篇大論了。這裡有兩者具體的技術的比較:http://hyperpolyglot.org/shell。


PowerShell是微軟的,特別針對Windows操作系統的,Linux Shell顧名思義,就是針對Linux操作系統的,其思想都是類似的,都是為了更方便的操作和管理計算機。

說起歷史,應該Linux Shell的歷史比PowerShell更為悠久,以前Window的操作管理都是用VB腳本來寫,比如添加一個用戶。配置一個網路伺服器,這樣雖然靈活,但是代碼量比較大,後續的維護比較麻煩,隨著微軟的.NET的推出,其也推出了PowerShell,因為PowerShell是後面才出來的,其功能和設計,我個人感覺都比Linux好用,其所以的命令,專業術語就做cmdlet,都是由一個動詞+名詞構成,比如Get-Item, Set-Item,可以通過Get-Help Get 命令,列出所有帶Get關鍵字的命令,

而且其每一個命令都有很多的官方的例子,基本上不用搜索,只要看例子,就能快速知道其如何使用,比如,我想知道,設置一個本地的用戶,先搜索,get-help users

得出操作User有上面的幾個命令,然後發現有一個set-LocalUser的命令,於是繼續輸入

get-help set-localUser -examples, 關於如何設置用戶的例子就出來,簡單吧,根本不需要上網查詢任何資料,只要英文好就行。


首先最大的區別,PowerShell是Dos命令的拓展,而Linux Shell是Unix命令的一種實現,它們兩的命令完全不同。Linux Shell(Bash)是通過環境變數和文本解析來解決邏輯上問題,而PowerShell(Batch)是完全的面向對象(OO)的。其區別主要有以下幾點:

1 bash 易用,速度快,但是難學,而且bash代碼特別難讀,讓你讀別人的shell代碼,你肯定會想要將自己的電腦砸掉。讓你看下Linux Bash源碼體驗下

*** 258,292 ****

int result;

- using_history ();

-

result = history_expand (line, &expansion);

- strcpy (line, expansion);

- free (expansion);

if (result)

! fprintf (stderr, "%s
", line);

! if (result < 0)

! continue;

! add_history (line);

@}

! if (strcmp (line, "quit") == 0) done = 1;

! if (strcmp (line, "save") == 0) write_history (0);

! if (strcmp (line, "read") == 0) read_history (0);

! if (strcmp (line, "list") == 0)

@{

! register HIST_ENTRY **the_list = history_list ();

register int i;

if (the_list)

for (i = 0; the_list[i]; i++)

! fprintf (stdout, "%d: %s
",

! i + history_base, the_list[i]->line);

@}

! if (strncmp (line, "delete", strlen ("delete")) == 0)

@{

int which;

! if ((sscanf (line + strlen ("delete"), "%d", &which)) == 1)

@{

HIST_ENTRY *entry = remove_history (which);

--- 435,473 ----

int result;

result = history_expand (line, &expansion);

if (result)

! fprintf (stderr, "%s
", expansion);

! if (result < 0 || result == 2)

! @{

! free (expansion);

! continue;

! @}

! add_history (expansion);

! strncpy (line, expansion, sizeof (line) - 1);

! free (expansion);

@}

! if (strcmp (line, "quit") == 0)

! done = 1;

! else if (strcmp (line, "save") == 0)

! write_history ("history_file");

! else if (strcmp (line, "read") == 0)

! read_history ("history_file");

! else if (strcmp (line, "list") == 0)

@{

! register HIST_ENTRY **the_list;

register int i;

+ the_list = history_list ();

if (the_list)

for (i = 0; the_list[i]; i++)

! printf ("%d: %s
", i + history_base, the_list[i]->line);

@}

! else if (strncmp (line, "delete", 6) == 0)

@{

int which;

! if ((sscanf (line + 6, "%d", &which)) == 1)

@{

HIST_ENTRY *entry = remove_history (which);

diff -rc2 bash-1.14.1/lib/readline/doc/hsuser.texinfo bash-1.14.2/lib/readline/doc/hsuser.texinfo

*** bash-1.14.1/lib/readline/doc/hsuser.texinfo Fri Jul 1 11:21:14 1994

--- bash-1.14.2/lib/readline/doc/hsuser.texinfo Thu Jul 21 15:47:19 1994

***************

看上面的代碼你肯定想殺人。

2 PowerShell執行速度比較慢,但是由於它是面向對象的,非常易讀,即使你沒有學過PowerShell但有一些編程基礎,你也能大概了解該段PowerShell是幹嘛的。下面看一段PowerShell的代碼,你最起碼有點賞心悅目的感覺。

$n=1

while($n -lt 6)

{

if($n -eq 4)

{

$n=$n+1

continue

}

else

{

$n

}

$n=$n+1

}

但是PowerShell有個大的槽點,和cmd一樣竟然不支持複製粘貼命令,太不人性化了。


Windows PowerShell 是一種腳本環境,使用戶可以利用.NET Framework的強大功能。

PowerShell 由一個命令行shell和內置在這個.NET框架上的編程語言組成。

PowerShell 採用的cmdlet讓能夠更深入到系統進程中,這些進程可以製作成可執行的文件或腳本(script)。一條cmdlet是一條輕量命令,比如顯示當前目錄的Get-Location,訪問文件內容的Get-Content和結束運行進程的Stop-Process。

Unix shell不基於.netframework。


管理windows時,使用cmd相當於使用低級腳本,使用powershell相當於使用高級腳本,因為powershell是可以直接調用.net中的類庫的。

管理linux時,使用shell也相當於使用低級腳本,使用python或perl相當於使用高級腳本。

powershell就類似於在linux中自帶的python或perl的作用了,使用高級的api或程序邏輯來簡化用cmd或shell難以實現和不能實現的腳本。


我想題主既然主動提問這樣的問題,想必是不想看充滿技術細節的長篇大論了,因為網上這樣的內容非常多,你使用這個問題直接去搜,就能搜到一大片。

所以我也長話短說,盡量用儘可能少的內容直白地講出它們最核心的區別。

一句話概括,二者定位不同,Linux Shell 是給用戶用的,而 PowerShell 是給開發/運維工程師用的,當然前者是包括後者的。

我們知道,使用 Windows 的話,不會 PowerShell 完全沒問題。但使用 linux 的話,不會 Shell 寸步難行。這既和兩種系統的特性有關,也和 PowerShell 和 Linux Shell 本身有關。

暫且不提操作系統層面的區別,只提這兩種語言的區別。二者的理念是有很大區別的。

PowerShell 的理念是,你花些時間和精力把我學好,那以後可以用我做很多複雜的事情,這是一個非常划算的買賣(雖然實際未必如此)。所以它的門檻是有一些高的,但功能更強大一些。

Linux Shell 的理念是,我要盡量簡單,你不需要花很多精力就可以用我做一些簡單的事情,但如果想做更多複雜的事情,那深入學習也是免不了的,但最好不要拿我做太複雜的事情,我會受不了的。

那麼大概就能體會出二者的核心區別是什麼了。


推薦閱讀:

TAG:PowerShell | 科技 | Linux |