[英]Is bash a programming language?
TL;博士; 什么是 shell 腳本? 它是一種編程語言/我們在 shell 腳本中使用了一種編程語言嗎?
免責聲明:有點離題
所以 bash 代表Bourne-again shell 。 (Unix)Shell 是一個命令行用戶界面,或者可以稱之為解釋器(?)
所以我正在填寫一份新工作的申請,然后你被要求提供不同編程語言的經驗,然后在底部有這個框其他經驗- 我開始輸入python 2.7、powershell、bas……等等! bash 不是一種編程語言——它是一個可以執行 shell 腳本的控制台……所以……嗯……哦,我的天哪,我不知道!
我們可以說是的,它是一種編程語言。
根據man bash
,Bash 是一種“兼容 sh 的命令語言”。 然后,我們可以說“命令語言”是“用戶與操作系統或應用程序進行通信的編程語言”。
從man bash
:
描述
Bash 是一個 sh 兼容的命令語言解釋器,它執行從標准輸入或文件中讀取的命令。 Bash 還結合了來自 Korn 和 C shell(ksh 和 csh)的有用功能。
http://www.gnu.org/software/bash/
Bash 是 GNU 項目的外殼。 Bash 是 Bourne Again SHell。 Bash 是與 sh 兼容的 shell,它結合了 Korn shell (ksh) 和 C shell (csh) 的有用功能。 它旨在符合 IEEE POSIX P1003.2/ISO 9945.2 外殼和工具標准。 它為編程和交互式使用提供了對 sh 的功能改進。 此外,大多數 sh 腳本無需修改即可由 Bash 運行。
一個 UNIX shell 是... http://en.wikipedia.org/wiki/Unix_shell
Unix shell 是一個命令行解釋器或 shell,它為 Unix 操作系統和類 Unix 系統提供傳統的用戶界面。 用戶通過將命令作為文本輸入以供命令行解釋器執行,或者通過創建一個或多個此類命令的文本腳本來指導計算機的操作。 用戶通常使用終端仿真器與 Unix shell 交互,但是,通過串行硬件連接或網絡會話的直接操作對於服務器系統很常見。
Bash 無疑是一種編程語言,專門用於 unix/linux shell 腳本。 它已經完成,因此您可以(理論上)在 Bash 中編寫任何程序。
編程語言到底是什么並沒有完美的定義,但你可以說每一種圖靈完備的語言都是一種編程語言,因為理論上每一個可以想象的程序都可以用它來編寫(即使它可能很尷尬)這樣做,即使它運行起來非常慢)。 而且 Bash 是圖靈完備的,所以沒有什么是不能用 Bash 編程的。
Bash 的問題,通常是 shell,它缺乏很多基本功能,因此在為它們編寫腳本時,實際上你經常調用外部程序來執行所需的工作。 但這只是走捷徑。 例如,如果您需要 shell 中的浮點功能,您可以實際實現它。 可以在圖靈完備的所有內容中編寫完整的 IEEE 754 標准實現。 在實踐中,這樣的實現將是巨大的,需要大量的內存並且速度非常慢,所以最好調用bc
。 但即使完全在 bash 中實現bc
也是可能的。
這是我曾經編寫的一個 bash 腳本,它將 Mandelbrot 設置為控制台。 如果您想看到最終結果,最好准備好喝杯咖啡,這將是一個非常漫長的夜晚:
#!/bin/bash
BAILOUT=16
MAX_ITERATIONS=1000
function iterate {
# $1 is x
# $2 is y
local zi=0
local zr=0
local i=0
local cr
cr=$(printf "%s\n" "scale=16; $2 - 0.5" | bc)
while true
do
local temp
local zr2
local zi2
i=$((i + 1))
zr2=$(printf "%s\n" "scale=16; ($zr * $zr) - ($zi * $zi) + $cr" | bc)
zi2=$(printf "%s\n" "scale=16; (($zr * $zi) * 2) + $1" | bc)
temp=$(printf "%s\n" "(($zi * $zi) + ($zr * $zr)) > $BAILOUT" | bc)
if ((temp == 1))
then
return "$i"
fi
if ((i > MAX_ITERATIONS))
then
return 0
fi
zr="$zr2"
zi="$zi2"
done
}
function mandelbrot {
local y
for ((y = -39; y < 39; y++))
do
printf "\n"
local x
for ((x = -39; x < 39; x++))
do
local xi
local yi
local ires
xi=$(printf "%s\n" "scale=16; $x / 40.0" | bc)
yi=$(printf "%s\n" "scale=16; $y / 40.0" | bc)
iterate "$xi" "$yi"
ires=$?
if ((ires == 0))
then
printf "*"
else
printf " "
fi
done
done
printf "\n"
}
mandelbrot
對於那些不能等待那么久的人,結果應該是這樣的:
*
*
*
*
*
***
*****
*****
***
*
*********
*************
***************
*********************
*********************
*******************
*******************
*******************
*******************
***********************
*******************
*******************
*********************
*******************
*******************
*****************
***************
*************
*********
*
***************
***********************
* ************************* *
*****************************
* ******************************* *
*********************************
***********************************
***************************************
*** ***************************************** ***
*************************************************
***********************************************
*********************************************
*********************************************
***********************************************
***********************************************
***************************************************
*************************************************
*************************************************
***************************************************
***************************************************
* *************************************************** *
***** *************************************************** *****
****** *************************************************** ******
******* *************************************************** *******
***********************************************************************
********* *************************************************** *********
****** *************************************************** ******
***** *************************************************** *****
***************************************************
***************************************************
***************************************************
***************************************************
*************************************************
*************************************************
***************************************************
***********************************************
***********************************************
*******************************************
*****************************************
*********************************************
**** ****************** ****************** ****
*** **************** **************** ***
* ************** ************** *
*********** ***********
** ***** ***** **
* * * *
它應該類似於這種旋轉 90 度的東西(並且有點擠壓):
遲到了這個 SO 問題,閱讀fedorqui 的答案,我認為“編程語言”與“命令語言”並不完全相同,意思是一種旨在運行命令的語言。
關於圖靈的考慮,是的,你可以...我個人圍繞bash編寫了很多庫(圍繞監控、備份、系統管理員、網絡等),但顯然要編寫程序,您必須使用真正的編程語言。
bash是一個外殼(如sh和其他外殼)! 意思是整體聚合器語言或超級語言。
第一個目標是成為一個交互式命令處理器,以便使用和維護posix系統。
他的第一個應用程序之一是創建wrapper以便為運行用其他語言編寫的程序准備環境。
所以這個命令處理器非常適合系統、文件系統、網絡和許多管理任務,因為它是交互式的,並且使用他的歷史記錄可以輕松創建腳本作業。
由於該語言旨在處理io s、 fork s、 fifo s,並且因為posix說一切都是文件,所以shell腳本通常可以直接或通過使用其他工具/二進制文件/應用程序來處理所有內容。 這種語言旨在圍繞一切創建條件、執行組和交互。
這可以打開系統、網絡、物聯網等之間的大量交互性......
一個腳本可以作為示例(進一步參見我的shell 連接器演示)。
1.同時打開DB、SSH連接和日志文件作為文件描述符。
2.創建SQL(臨時或非臨時)表
3.做循環,檢查數據庫事件,SSH連接或其他......
4.與 DB 和/或 SSH 交互...
5.關閉所有文件描述符(DB、SSH、日志文件等)
對Mecki 的回答的評論展示了如何使用bash處理其他二進制文件(對於 Mandelbrot 的bc
)的一個很好的示例......
其中shell用於運行bc
並匯總他的答案。
bc -l
以提交所有計算,將執行時間降低到8 分鍾。bc
,將自己的執行時間降低到8 秒。bc
,以便使用多核,將執行時間近似地除以可用內核......(感謝Léa Gris的貢獻,幫助使這個posix兼容,多核的想法和添加顏色,使這個接近美麗,我忍不住發布他的結果) 我寫了一些腳本來展示這種強大的並行化能力:
ping
並使用gnuplot
繪制動態圖形,同時保持交互。sqlite
、 date
和bc
作為后台協同進程(如果run )。 為了進行一些監控,檢查差異等,我們可以創建一個腳本來打開許多同時連接到許多不同目標的連接,使用netcat
, sql-client
, ftp
, open-ssl s_client
, ssh
或其他.. .
...能夠在需要時運行sha1sum
、 grep
、 xmlint
或bc
(如果還沒有后台),同時連接保持打開...
shell是一種超級語言,可用於使用各種語言的許多程序聚合一個復雜的應用程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.