# 做為註解的 歷史發展

1974–1975:Ratfor – Brian Kernighan 在其 Ratfor 預處理程序中首次使用 # 表示註釋。這是經過驗證的首次使用。

1976:make – Stuart Feldman 在 make 建置工具中使用 # 作為註解。

1977:awk – # 作為註解字元出現在 awk 語言中。

1978:csh(C shell) – Bill Joy 在 C shell 中使用 # 作為註釋,這是第一個使用 # 的 shell。

1980年代:Bourne shell 與 Shebang(#!) – 當 Dennis Ritchie 將 #! 機制加入 Unix 內核後,後續的腳本語言(如 1987 年的 Perl 和 1991 年的 Python)為了兼容這一機制,也採用了 # 作為註釋符。
GailLim
說白了您不懂,不敢刪。沒錯,這樣安全。燃鵝,要探究語法,自己稍稍研究是必要的。
cruiseton
真的是沒救 [笑到噴淚]
鳥哥的 LINUX 第十二章、學習Shell Scripts

https://linux.vbird.org/linux_basic/centos7/0340bashshell-scripts.php

程式內容的說明:
整個 script 當中,除了第一行的『 #! 』是用來宣告 shell 的之外,其他的 # 都是『註解』用途! 所以上面的程式當中,第二行以下就是用來說明整個程式的基本資料。一般來說, 建議你一定要養成說明該 script 的:1. 內容與功能; 2. 版本資訊; 3. 作者與聯絡方式; 4. 建檔日期;5. 歷史紀錄 等等。這將有助於未來程式的改寫與 debug 呢!

把你常做的 事/commands 寫成 shell script .sh 檔案, 就不用一直在 terminal 重寫一些指令
選舉
我想到張林文賢者這阿達人 他最後轉到其他地方了
#! 叫做 shebang(也叫 hashbang),中文常說:
  • Shebang 行
  • 解譯器宣告行
  • 腳本啟動行
它的作用是:告訴 Linux/Unix「要用哪個程式來執行這個腳本」
例如:

#!/bin/bash
echo "Hello"

意思是:
/bin/bash 來執行這個檔案。

系統看到你執行:

./myscript.sh

其實會自動變成:
/bin/bash ./myscript.sh


#! 到底是什麼?

它是檔案第一行的特殊標記
#!<解譯器路徑>

例如:
#!/bin/sh
#!/bin/bash
#!/usr/bin/env bash
#!/usr/bin/env python3

Linux 核心(kernel)看到檔案開頭是 #!,就知道:
「這不是二進位程式,要交給後面的解譯器來執行。」

一定需要嗎?

不一定。

情況 1:你直接指定解譯器 → 不需要

例如:
bash script.sh

或:
sh script.sh

因為你已經明確告訴系統:
bash 執行這個檔案。

所以 #! 可有可無。

情況 2:你想直接執行 → 需要

例如:
chmod +x script.sh
./script.sh

這時 Linux 會看第一行的 #!

如果沒有 shebang,可能會出現:
Exec format error

或用錯 shell 執行。


會影響什麼?

1. 決定用哪個 shell

這很重要。
例如:
#!/bin/sh

和:
#!/bin/bash

可能結果不同。
例如這段:
arr=(a b c)

只有 bash 支援。
如果 shebang 是:
#!/bin/sh

可能會報錯:

Syntax error


2. 影響可攜性(portable)

很多人推薦:
#!/usr/bin/env bash

而不是:

#!/bin/bash

原因:
有些系統的 bash 不在 /bin/bash,可能在:
/usr/local/bin/bash

/usr/bin/env bash 會自動去 PATH 裡找 bash
比較通用。

3. 編輯器會參考它

GeanyVisual Studio Code 會看 shebang 判斷語言:
例如:
#!/usr/bin/env python3

即使副檔名不是 .py,也可能自動當 Python。

4. cron / systemd 會用到

如果排程工具直接執行腳本:
/path/to/script.sh

沒有 shebang 可能失敗。

#! 是註解嗎?

有趣的是:對 shell 來說,是。
因為:
# 這是註解

所以 shell 看到:
#!/bin/bash

只會當註解。
但在 shell 看到之前,Linux kernel 已經先讀了這一行,把它當成特殊指令。
所以:
  • 對 kernel:是啟動指令
  • 對 shell:是註解
兩者都對。

常見寫法

POSIX shell(最通用)

#!/bin/sh


Bash(常用)

#!/bin/bash


更可攜的 Bash(推薦)

#!/usr/bin/env bash


Python

#!/usr/bin/env python3


Node.js

#!/usr/bin/env node


實用建議

如果你寫的是 Bash script,通常建議:
#!/usr/bin/env bash

如果你每次都這樣執行:

bash script.sh

那 technically 不需要 shebang。
還是建議加上,因為:
  • 清楚標示要用哪個解譯器
  • 之後可以直接 ./script.sh
  • 避免別人用錯 shell 執行
  • 工具(editor、cron、systemd)比較容易正確辨識
可以把它理解成:
這個腳本的「開啟方式」宣告。
GailLim
拜託您文字整理一下,空行太多,讀起來很累~~~~
例如/etc/default/grub裡:

# Uncomment to disable graphical terminal
GRUB_TERMINAL=console

若刪除 #,Grub會呈現純文字;保留 # ,Grub會呈現圖片。

「#」只是「註解」?可有可無?
GailLim wrote:
# Uncomment to disable graphical terminal
GRUB_TERMINAL=console

若刪除 #,Grub會呈現純文字;保留 # ,Grub會呈現圖片。

「#」只是「註解」?可有可無?


沒有 # 就變成有意義的指令或設定, 寫錯就會出錯或被忽略不執行

原本

# Uncomment to disable graphical terminal
#GRUB_TERMINAL=console

#GRUB_TERMINAL=console 原本只是註解所以 grub 完全忽略, 視而不見繼續用 預設的graphical GUI

Uncomment 拿掉 #GRUB_TERMINAL=console 前方的# 就變成告訴 grub 要認定 GRUB_TERMINAL=console 這設定啊


Shell 教學

https://www.youtube.com/results?search_query=shell+%E6%95%99%E5%AD%B8
我改寫的fstab第一段:#/etc/fstab: static file system information.

若沒「#」,系統開機直接讀取「/etc/fstab」路徑,以為是掛載指令,當然錯誤,這就是為何當我全刪「#」後,黑底白字跑很久,無法開機的理由。

加上「#」後,等於告訴系統「這是張報表,把它當作Table Header,不要執行它!」

第二段,我曾經整段刪除,沒事,僅僅說明文字。

第三段第一行結構是「# 〈〉〈〉〈〉〈〉〈〉〈〉」,若沒加「#」,系統開機會直接讀這一行,加「#」,等於告訴系統「這一行是表格標題」。

在 Linux 的結構裡,它就像是隱形的〈tr〉〈td〉,若沒這行標題,系統會無法對齊下面的表格欄位,開不了機。

我修改過他人的QSS或CSS,很多註解的文字,一旦刪除,程式卻反而執行不了。那些註解文字,像是「代碼緩衝墊」,或是給特定編譯器識別的暗號。

「#」只是「註解」?沒錯,但在fstab裡,它的「註解」是——這是一張表格喔!!

「#」就像國中生的「參考書」——以為「參考書」只有「參考用」?🤣除非您沒讀過國中。
網路文章一大堆, 書店教科書一大堆

Youtube 教學一大堆, AI 一大堆 都同樣說法

否定所有老師, 工程師, programmers, UNIX/Linux creators ?

繼續堅持你的表格理論
GailLim
您自己改寫看看,反正您是用虛擬機,也沒損失😆
GailLim
鄙人才疏學淺,一開始誤以為「#」就是表格,是該慚愧。燃鵝,在fstab裡,「#」確實是註解「這是一張表格喔」。若您硬要把「#」全部拿掉,等於讓系統開機自撞,您虛擬機當然無所謂……
#40 樓 用的就是虛擬機, 去掉所有註解列並重開機

cruiseton wrote:
#40 樓 用的就是...(恕刪)
fstab可以去掉所有的「#」嗎?

AI摘要

不建議直接刪除/etc/fstab中所有的「#」符號。在Linux的/etc/fstab檔案中,「#」符號是用作註解(Comment)的標記。

以下是原因與注意事項:「#」的作用:系統會忽略任何以「#」開頭的行。這通常用於暫時停用某個掛載設定,或者解釋該行配置的用途。

直接刪除的後果:如果您刪除了「#」,系統可能會嘗試掛載該行設定的裝置。如果該裝置不存在、無法存取或配置錯誤,可能會導致系統開機時進入緊急模式(Emergency Mode)或無法開機。

正確的做法:如果您想徹底停用該掛載,請直接刪除整行,而不是只刪除「#」符號。如果您只想停用某行,請在行首加上「#」使其成為註解,確保系統忽略它。

總結:保留「#」符號是為了標註哪些設定是停用的。

若為了清理檔案,直接刪除整行註解是安全的,但將所有註解符號刪除可能會誤啟動錯誤的掛載配置。
只刪除 # 和刪除整行完全不同, OK?

只刪除 # 使得 # 後面的文字全部變成了 commands / settings 當然出錯!

==

出門去了
GailLim
拜託喔~~,您實驗老半天,原來是「刪除整行」做實驗,噗嗤🤣
GailLim
第38樓我的回應拜託看清楚!我從未說過「刪除整行」而是刪除全部「#」~~
關閉廣告
文章分享
評分
評分
複製連結
請輸入您要前往的頁數(1 ~ 14)

今日熱門文章 網友點擊推薦!