Skip to content

Zeroplex 生活隨筆

軟體開發、伺服器和生活瑣事

小 縮小字型大小。 中 重設字型大小。 大 放大字型大小。

標籤: Bash

Linux Console 中 cd 的指令並非 GNU 工具

Posted on 2021 年 12 月 1 日2021 年 12 月 1 日 By 日落 在〈Linux Console 中 cd 的指令並非 GNU 工具〉中尚無留言

有使用 Linux 作為伺服器的人應該都算熟悉終端機操作界面。

常用的檔案操作工具有 ls、cat、mv、cp 等等,這些都是 GNU project 提供的開源工具,可以自行下載原始碼並自行編譯、部屬在需要用到的平台上使用。但 cd 這個切換目錄的指令呢?

用 which、whereis 都查不到 cd 這個檔案到底儲存在哪個目錄下,因為真的沒這檔案。

cd 並不在 /bin 或 /usr/local/bin 目錄下,其實是 shell (sh, tcsh, bash 等) 內建的指令。所以即使在不同的系統上,只要有正確安裝 shell,就有 cd 這個指令來切換 working directory。

備註:怎麼發現的?就不小心 sudo rm -fr / 而已 … _Drz

Tags:Bash, Linux

駭客軍團之 shebang

Posted on 2021 年 9 月 27 日2021 年 9 月 27 日 By 日落 在〈駭客軍團之 shebang〉中尚無留言

在駭客軍團的第 5 集約 39 分附近,因為失去「黑暗軍團」的幫忙,駭客想要馬上執行惡意程式來破壞「鋼山」公司的主機,如果有注意到的話,終端機的指令大致如下:

$ cd /opt/2/task/22/fdinfo/fsociety/hscripts
$ ./fuxsocy

影片中直接使用 ./ 來執行特定指令或 script,但並沒有特別指定要用 shell 或是要用 python?那這樣的話,電腦怎麼知道是執行檔可以直接載入記憶體中執行?或是否需要其他直譯器來執行?

Linux 和 Unix 在設計時有想到這個問題,目前大多數的解決方法,就是在檔案的第一行最前面加上 #! 符號作為標示,在標示後面跟著直譯器的絕對路徑,這樣就可以知道開發者需要使用哪個直譯器來跑這個 script。這個作法後來被稱為「shebang」。

More “駭客軍團之 shebang” »

Tags:Bash, Linux

讓 less 可以顯示 ANSI 色彩

Posted on 2019 年 8 月 23 日2021 年 3 月 12 日 By 日落 在〈讓 less 可以顯示 ANSI 色彩〉中尚無留言

應該不少人有經驗,在使用 grep 時,要搜尋的關鍵字會用顏色 highlight 方便閱讀,例如:

$ ls -lh | grep php
-rw-rw-r--  1 zero zero  178 Aug 22 19:15 autoload.php
drwxrwxr-x  3 zero zero 4.0K Aug 22 19:01 cakephp
drwxrwxr-x  5 zero zero 4.0K Aug 22 19:01 phpdocumentor
drwxrwxr-x  3 zero zero 4.0K Aug 22 19:01 phpoffice
drwxrwxr-x  3 zero zero 4.0K Aug 22 19:01 phpoption
drwxrwxr-x  3 zero zero 4.0K Aug 22 19:01 phpseclib
drwxrwxr-x  3 zero zero 4.0K Aug 22 19:01 phpspec
drwxrwxr-x  8 zero zero 4.0K Aug 22 19:01 phpunit

不過如果因為列表很長,在把搜尋結果 pipe 給 less 以後,顏色就消失了。

這其實是 grep 這邊會判斷 output 到哪一種型態的 I/O,像是後面接的是 bash pipe,grep 就會自動移除 ANSI color 的 syntax,畢竟不知道 pipe 資料給誰,如果後者不支援 ANSI color 就會變成亂碼。

如果很確定 pipe 後面的指令、工具支援 ANSI color 的指令,就可以下參數要求 grep 輸出顏色。例如:

$ ls -lh | grep php --color=always | less
-rw-rw-r--  1 zero zero  178 Aug 22 19:15 autoload.php
drwxrwxr-x  3 zero zero 4.0K Aug 22 19:01 cakephp
drwxrwxr-x  5 zero zero 4.0K Aug 22 19:01 phpdocumentor
drwxrwxr-x  3 zero zero 4.0K Aug 22 19:01 phpoffice
drwxrwxr-x  3 zero zero 4.0K Aug 22 19:01 phpoption
drwxrwxr-x  3 zero zero 4.0K Aug 22 19:01 phpseclib
drwxrwxr-x  3 zero zero 4.0K Aug 22 19:01 phpspec
drwxrwxr-x  8 zero zero 4.0K Aug 22 19:01 phpunit
Tags:Bash, Linux

GNU grep 的 exit code 會因結果而不同

Posted on 2019 年 5 月 7 日2021 年 3 月 12 日 By 日落 在〈GNU grep 的 exit code 會因結果而不同〉中尚無留言

昨天寫了類似以下這樣一段 script:

#!/usr/bin/env bash

set -e

R=`ls /dev/ | grep sd`

echo "Results found:"
echo $R

照理來說,不管 grep 是有有撈到資料,至少會印出「Results found」字樣,但實際執行時卻什麼資料都沒有輸出。

後來使用「bash -xv」來執行,監視值流程,才發現 script 執行到一半就中斷了:

$ bash -xv qwe.sh 
#!/usr/bin/env bash

set -e
+ set -e

R=`ls /dev/ | grep sd`
++ ls /dev/
++ grep sd
+ R=

追蹤後發現二個結果交互影響導致 script 中斷:

  • set -e 的設定
  • grep 的 exit code

在 bash 中「set -e」代表遇到錯誤立即中斷執行;而 grep 的 exit code 比較令人意外,當 grep 有找到資料時,則 exit code 為 0 (正常結束),若 grep 都沒有找到指定的字串,則會回傳 1 (錯誤)。這二件事情同時發生,所以就導致了上面的 script 在 grep 執行後就中斷執行。

// ——

shell script 好像沒什麼 debug 的工具,不過在執行時可以透過 bash 的參數,來提供執行時的一些狀態,例如: -xv。

Tags:Bash, Linux

在 bash 看指令執行後的 exit status code

Posted on 2019 年 5 月 6 日2021 年 3 月 12 日 By 日落 在〈在 bash 看指令執行後的 exit status code〉中尚無留言

老題目了,做個筆記。

Linux 底下,所有程式、指令結束都會有個 exit code,有點像是執行成功、或失敗的狀態。一般來說,正常執行的 exit code 都會是 0。

如果要看前一個指令執行後的 exit code,可以使用「echo $?」來看:

$ cd .
$ echo $?
0
$ mkdir app
mkdir: cannot create directory ‘app’: File exists
echo $?
1
Tags:Bash, Linux

文章分頁

上一頁 1 2 3 4 ... 6 下一頁

其他

關於我  (About me)

小額贊助

  文章 RSS Feed

  留言 RSS Feed

Apache AWS Bash C/C++ Docker FreeBSD GCP Git Google Java JavaScript Laravel Linux Microsoft MSSQL MySQL Nginx PHP PHPUnit PostgreSQL Python Qt Ubuntu Unix Vim Web Windows WordPress XD 作業系統 分享 好站推薦 專題 攝影 新奇搞笑 新聞 旅遊 生活雜記 程式設計 網路架站 網頁設計 資訊學習 資訊安全 遊戲 音樂


創用 CC 授權條款
本著作係採用創用 CC 姓名標示-相同方式分享 4.0 國際 授權條款授權.