首頁 » 程式語言 » shell » 【程式語言】解決 shell script 無法 cd 的問題

【程式語言】解決 shell script 無法 cd 的問題

如果你在寫 shell script 的時候,遇到了 cd: can’t cd to … 的話,表示你遇到了一個坑,這篇文章教你如何解決這個問題。

【程式語言】解決 shell script 無法 cd 的問題
【程式語言】解決 shell script 無法 cd 的問題

問題來源

今天我在寫一支 shell script 時,在內容裡面寫了 cd 到某個目錄,結果發現 cd 失敗。

#!/bin/sh
cd /var

我得到的回應是:

test.sh: 2: cd: can’t cd to /var
: not found test.sh: ls

後來開始找了 Google ,找到了這篇文章:Why doesn’t “cd” work in a shell script?

我試了非常多回文中的方法,結果發現通通都失敗。

最後發現是編碼以及使用方法的雙重問題

 

解決方法

step 1

因為太常使用 Notepad ++ 這個超神編輯器,導致我的換行格式是採用 Windows ,所以在 Linux 上自然會失敗。

有兩種方法可以解決:

1. 在 Notepad++ 的工具列,編輯 -> 換行格式 -> 轉換成 UNIX 格式

轉換成 UNIX 格式
轉換成 UNIX 格式

2. 用 Linux 原生的編輯器編輯,我自己是習慣用 vi。

 

step 2

再來的問題就是 sh 與 source 指令的差別。

我覺得這篇回應講得很好,也不知道怎麼翻譯,直接貼上原文:What is the difference between using `sh` and `source`?

When you call source (or its alias .), you insert the script in the current bash process. So you could read variables set by the script.

When you call sh, you initiate a fork (sub-process) that runs a new session of /bin/sh, which is usually a symbolic link to bash. In this case, environment variables set by the sub-script would be dropped when the sub-script finishes.

簡單來說就是使用 sh 的環境變數會跟隨著 bash,我們無法控制。

所以當我要的 shell 有 cd 的時候,我應該使用 source test.sh 或是 . test.sh 來執行。

希望大家不要犯了跟我一樣的錯唷!

如果對文章內容有任何問題,歡迎在底下留言讓我知道。

如果你喜歡我的文章,可以按分享按鈕,讓更多的人看見我的文章。

還沒訂閱部落格的朋友們,記得在下方填入信箱,收到我最新文章的通知。

歡迎追蹤我的粉絲專頁,會有最新文章、程式語言課程、WordPress主題外掛優惠的訊息。

如果這篇文章對你有幫助,可以幫我按 5 個Like,讓我得到一些回饋,支持我繼續寫出更多好文章!

by Johntool-工具王阿璋

訂閱我的文章

如果喜歡我的文章,可以留下信箱,每發佈新文章時,就會準時通知您!

發表迴響