java linux cd命令无效,为什么“cd”不能在shell脚本中工作?
回答(29)
2 years ago
您可以結合使用Adam&Greg的別名和點式方法來制作更具動感的內容 -
alias project=". project"
現在運行項目別名將在當前shell中執行項目腳本而不是子shell .
2 years ago
這應該做你想要的 . 切換到感興趣的目錄(從腳本中),然后生成一個新的bash shell .
#!/bin/bash
# saved as mov_dir.sh
cd ~/mt/v3/rt_linux-rt-tools/
bash
如果你運行它,它將帶你到感興趣的目錄,當你退出它時,它會帶你回到原來的位置 .
root@intel-corei7-64:~# ./mov_dir.sh
root@intel-corei7-64:~/mt/v3/rt_linux-rt-tools# exit
root@intel-corei7-64:~#
這將甚至會在您退出時返回原始目錄(CTRL d)
2 years ago
在尋找您想要運行的腳本是一種解決方案時,您應該知道此腳本可以直接修改當前shell的環境 . 此外,再也無法傳遞參數 .
另一種方法是將您的腳本實現為bash中的一個函數 .
function cdbm() {
cd whereever_you_want_to_go
echo "Arguments to the functions were $1, $2, ..."
}
2 years ago
腳本中的 cd 在技術上起作用,因為它更改了運行腳本的shell的目錄,但這是一個從交互式shell派生的獨立進程 .
與Posix兼容的解決此問題的方法是定義shell過程而不是shell調用的命令腳本 .
jhome () {
cd /home/tree/projects/java
}
您可以在其中輸入或將其放入各種shell啟動文件中 .
2 years ago
您可以使用運算符&&:
cd myDirectory && ls
2 years ago
我有一個名為p的簡單bash腳本來管理目錄更改
github.com/godzilla/bash-stuff
只需將腳本放在本地bin目錄中(/ usr / local / bin)
并把
alias p='. p'
在你的.bashrc中
2 years ago
制作一個將cd到選擇目錄的bash腳本:
創建腳本文件
#!/bin/sh
# file : /scripts/cdjava
#
cd /home/askgelal/projects/java
然后在啟動文件中創建別名 .
#!/bin/sh
# file /scripts/mastercode.sh
#
alias cdjava='. /scripts/cdjava'
我創建了一個啟動文件,我將轉儲所有別名和自定義函數 .
然后我將此文件發送到我的.bashrc中,以便在每次啟動時設置它 .
例如,創建主別名/函數文件: /scripts/mastercode.sh
(將別名放在此文件中 . )
然后在 .bashrc 文件的末尾:
source /scripts/mastercode.sh
現在很容易cd到你的java目錄,只需鍵入cdjava,你就在那里 .
2 years ago
Using Bash Profile Functions :
bash配置文件的一個功能是存儲可以在終端或bash腳本中運行的自定義函數,就像運行應用程序/命令一樣,這也可以用作長命令的快捷方式 .
為了使您的功能高效系統,您需要在幾個文件的末尾復制您的功能
/home/user/.bashrc
/home/user/.bash_profile
/root/.bashrc
/root/.bash_profile
您可以 sudo kwrite /home/user/.bashrc /home/user/.bash_profile /root/.bashrc /root/.bash_profile 快速編輯/創建這些文件
Script Example
用 cdd 制作 cd .. 的快捷方式
cdd() {
cd ..
}
是捷徑
ll() {
ls -l -h
}
是捷徑
lll() {
ls -l -h -a
}
Howto :
復制文件末尾的函數并重新啟動終端,然后運行 cdd 或您編寫的任何函數
2 years ago
你沒有做錯任何事!您已更改目錄,但僅在運行腳本的子shell中 .
您可以使用“dot”命令在當前進程中運行腳本:
. proj
但我更喜歡Greg建議在這個簡單的例子中使用別名 .
2 years ago
它只更改腳本本身的目錄,而當前目錄保持不變 .
您可能想要使用symbolic link . 它允許您為文件或目錄創建"shortcut",因此您只需輸入類似 cd my-project 的內容 .
2 years ago
您不需要腳本,只需設置正確的選項并創建環境變量 .
shopt -s cdable_vars
在你的 ~/.bashrc 允許 cd 到環境變量的內容 .
創建這樣的環境變量:
export myjava="/home/tree/projects/java"
你可以使用:
cd myjava
2 years ago
您可以組合別名和腳本,
alias proj="cd \`/usr/bin/proj !*\`"
只要腳本回顯目標路徑 . 請注意,這些是圍繞腳本名稱的反引號 .
例如,您的腳本可能是
#!/bin/bash
echo /home/askgelal/projects/java/$1
這種技術的優點是腳本可以采用任意數量的命令行參數,并發出可能由復雜邏輯計算的不同目的地 .
2 years ago
最后使用exec bash
一個bash腳本對它進行操作當前環境或其子環境,但從不在其父環境中 .
但是,這個問題經常被問到,因為在從另一個目錄執行bash腳本之后,想要在某個目錄中保留bash提示符 .
如果是這種情況,只需在腳本末尾執行子bash實例:
#!/bin/bash
cd /home/tree/projects/java
exec bash
2 years ago
LOOOOOng之后的時間,但我做了以下事情:
創建一個名為case的文件
將以下內容粘貼到文件中:
#!/bin/sh
cd /home/"$1"
保存然后:
chmod +x case
我還在 .bashrc 中創建了一個別名:
alias disk='cd /home/; . case'
現在當我輸入:
case 12345
基本上我打字:
cd /home/12345
你可以在'case'之后輸入任何文件夾:
case 12
case 15
case 17
這就像打字:
cd /home/12
cd /home/15
cd /home/17
分別
在我的情況下,路徑更長 - 這些家伙早先用~info總結了它 .
2 years ago
如果以反斜杠結束行,則可以在同一子shell中執行某些行 .
cd somedir; \
pwd
2 years ago
Shell腳本在子shell中運行,每個子shell都有自己的當前目錄概念 . cd 成功,但是一旦子shell退出,你就會回到交互式shell中,并且沒有任何改變 .
解決此問題的一種方法是使用別名:
alias proj="cd /home/tree/projects/java"
2 years ago
cd 在腳本's shell. When the script ends, that shell exits, and then you are left in the directory you were. 167294 the script, don'中運行它 . 代替:
./myscript.sh
做
. ./myscript.sh
(注意腳本名稱前面的點和空格 . )
2 years ago
我使用 . 讓我的代碼工作
./ 劑量不起作用,因為它不會更改終端中的目錄,只會更改特定于該腳本的目錄 .
這是我的計劃
#!/bin/bash
echo "Taking you to eclipse's workspace."
cd /Developer/Java/workspace
這是我的終端
nova:~ Kael$
nova:~ Kael$ . workspace.sh
Taking you to eclipe's workspace.
nova:workspace Kael$
2 years ago
在我的特定情況下,我需要太多次來更改同一目錄 . 所以在我的.bashrc(我使用ubuntu)我添加了
1 -
$ nano~./ bashrc
function switchp
{
cd /home/tree/projects/$1
}
2-
$ source~ / .bashrc
3 -
$ switchp java
它會直接執行:cd / home / tree / projects / java
希望有所幫助!
2 years ago
您可以在 .bash_profile 中創建如下所示的功能,它將順利運行 .
以下函數采用可選參數,即項目 . 例如,您可以運行
cdproj
要么
cdproj project_name
這是功能定義 .
cdproj(){
dir=/Users/yourname/projects
if [ "$1" ]; then
cd "${dir}/${1}"
else
cd "${dir}"
fi
}
別忘了找你的 .bash_profile
2 years ago
如果您使用fish作為shell,最好的解決方案是創建一個函數 . 例如,根據原始問題,您可以復制下面的4行并將其粘貼到fish命令行中:
function proj
cd /home/tree/projects/java
end
funcsave proj
這將創建該功能并保存以供日后使用 . 如果您的項目發生變化,只需使用新路徑重復該過程即可 .
如果您愿意,可以通過執行以下操作手動添加功能文件:
nano ~/.config/fish/functions/proj.fish
并輸入文字:
function proj
cd /home/tree/projects/java
end
最后按ctrl x退出,然后按y返回以保存更改 .
(注意:第一種使用funcsave的方法會為你創建proj.fish文件) .
2 years ago
當您觸發shell腳本時,它會運行該shell的新實例( /bin/bash ) . 因此,您的腳本只會啟動一個shell,更改目錄并退出 . 換句話說,shell腳本中的 cd (以及其他此類命令)不會影響也無法訪問啟動它們的shell .
2 years ago
Jeremy Ruten使用符號鏈接的想法觸發了一個沒有超越任何其他答案的想法 . 使用:
CDPATH=:$HOME/projects
前導結腸很重要;這意味著如果當前目錄中有一個目錄'dir',那么' cd dir '將更改為該目錄,而不是在其他地方跳轉 . 如圖所示設置值,您可以執行以下操作:
cd java
并且,如果當前目錄中沒有名為java的子目錄,那么它將直接轉到$ HOME / projects / java - 沒有別名,沒有腳本,沒有可疑的exec或點命令 .
我的$ HOME是/ Users / jleffler;我的$ CDPATH是:
:/Users/jleffler:/Users/jleffler/mail:/Users/jleffler/src:/Users/jleffler/src/perl:/Users/jleffler/src/sqltools:/Users/jleffler/lib:/Users/jleffler/doc:/Users/jleffler/work
2 years ago
你可以這樣做:
#!/bin/bash
cd /your/project/directory
# start another shell and replacing the current
exec /bin/bash
編輯:這也可以“點綴”,以防止后續shell的創建 .
例:
. ./previous_script (with or without the first line)
2 years ago
您可以使用 . 在當前shell環境中執行腳本:
. script_name
或者,它更具可讀性但是特定于shell的別名 source :
source script_name
這避免了子shell,并允許任何變量或內置函數(包括 cd )來影響當前的shell .
2 years ago
在?/ .bash_profile文件中 . 添加下一個功能
move_me() {
cd ~/path/to/dest
}
重啟終端,您可以輸入
move_me
然后您將被移動到目標文件夾 .
2 years ago
只需運行:
cd /home/xxx/yyy && command_you_want
總結
以上是生活随笔為你收集整理的java linux cd命令无效,为什么“cd”不能在shell脚本中工作?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【经典算法实现 14】阿克曼函数(手动推
- 下一篇: c语言投票程序设计,《C语言及程序设计》