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 |