將目錄傳遞給 cd
我有一個功能,我希望它能讓我對我一直在查看的最新目錄進行模糊搜尋並節省我的時間,一個簡單的 1 班輪:
dirs | sed 'y/ /\n/' | fzf | xargs cd
2小時後,我無法弄清楚出了什麼問題):
我不斷收到以下錯誤:
/usr/bin/cd: line 4: cd: ~/Downloads/demo: No such file or directory
即使目錄確實存在,無論我做什麼。cd怎麼了,為什麼這不起作用?
感謝您的評論:更多資訊 我嘗試了其他一些方法,例如編寫函式:
fdr() { local dir dir=`dirs | sed 'y/ /\n/' | fzf` cd $dir }
即使
dir
具有正確的值,我也會得到與上面相同的錯誤。我的最終功能
感謝您的幫助,子殼正在使我頭疼,這是我的最終答案,有點駭人聽聞,但是這些天不是。
fdr() { local dir myusernmae=`whoami` dir=`dirs | sed 'y/ /\n/' | sed "s/~/\/Users\/$myusernmae/g" | fzf +m` cd "$dir" }
這裡有三個問題:
- 即使正確的路徑可能
cd
類似於.~/Downloads/demo``/Users/snickers/Download/demo
通常,當您在命令行上鍵入時,shell 會在執行命令
cd ~/Downloads/demo
之前將波浪號展開到您的主目錄的路徑。cd
這在這裡不會發生,因為波浪號擴展發生在變數擴展之前(請參閱“如何理解擴展之間的順序? ”)。假設您使用的是
bash
shell,usingdirs -l
可以通過讓dirs
輸出完整路徑來繞過這個問題。 2.cd
是一個shell內置命令。在您的 macOS 機器上,它也可以作為外部命令使用/usr/bin/cd
,這就是為什麼您沒有像許多其他 Unix 使用者在使用cd
with時遇到“command not found”錯誤的原因xargs
。但是,外部cd
命令永遠不能更改目前 shell 的目錄。這在“為什麼 cd 不是程序? ”和“cd
位於哪裡? ”和類似問題中有所描述。你的 shell 函式變體繞過了這個問題,因為它使用你的 shell 的內置cd
命令。 3. 最後一個問題是第二個問題的變體,由於其他問題而實際上並沒有發揮作用,是該cd
命令在執行時xargs
不僅是無法更改工作目錄的外部命令對於呼叫 shell,但呼叫它的命令是xargs
,它又在子 shell 中作為管道的一個階段執行。在子 shell 中更改 shell 不會在父 shell 中更改它。你應該可以使用
fdr () { cd "$( dirs -l -p | fzf )" }
其中每行
dirs -l -p
從目錄堆棧輸出一個目錄bash
,波浪號展開。這假設您在堆棧上沒有目錄名稱中嵌入了換行符,但將支持帶有空格的目錄(您自己的函式不這樣做,部分原因是sed
轉換,部分原因是沒有引用 的擴展$dir
)。