我正在尝试编写一个小脚本来将当前目录更改为我的项目目录:
#!/bin/bash
cd /home/tree/projects/java
Run Code Online (Sandbox Code Playgroud)
我将此文件保存为proj,添加了执行权限chmod,并将其复制到/usr/bin.当我通过以下方式调用它时
proj,它什么都不做.我究竟做错了什么?
Gre*_*ill 613
Shell脚本在子shell中运行,每个子shell都有自己的当前目录概念.的cd成功,但只要子shell退出,你回来在交互式shell和从来都没有改变,因此.
解决此问题的一种方法是使用别名:
alias proj="cd /home/tree/projects/java"
Run Code Online (Sandbox Code Playgroud)
Ada*_*iss 484
你没有做错任何事!您已更改目录,但仅在运行脚本的子shell中.
您可以使用"dot"命令在当前进程中运行脚本:
. proj
Run Code Online (Sandbox Code Playgroud)
但是我更喜欢Greg建议在这个简单的例子中使用别名.
Dig*_*oss 213
该cd脚本中的技术工作,因为它改变了运行脚本的外壳的目录,但是这是从你的交互shell分叉一个单独的进程.
与Posix兼容的解决此问题的方法是定义shell过程而不是shell调用的命令脚本.
jhome () {
cd /home/tree/projects/java
}
Run Code Online (Sandbox Code Playgroud)
您可以在其中输入或将其放入各种shell启动文件中.
小智 149
这cd是在脚本的shell中完成的.当脚本结束时,该shell退出,然后您将保留在您所在的目录中."源"脚本,不要运行它.代替:
./myscript.sh
Run Code Online (Sandbox Code Playgroud)
做
. ./myscript.sh
Run Code Online (Sandbox Code Playgroud)
(注意脚本名称前面的点和空格.)
小智 95
创建脚本文件
#!/bin/sh # file : /scripts/cdjava # cd /home/askgelal/projects/java
然后在启动文件中创建别名.
#!/bin/sh # file /scripts/mastercode.sh # alias cdjava='. /scripts/cdjava'
例如,创建一个主别名/函数文件:/scripts/mastercode.sh
(将别名放在此文件中.)
然后在.bashrc文件的末尾:
source /scripts/mastercode.sh
现在很容易cd到你的java目录,只需输入cdjava就可以了.
小智 46
您可以使用.在当前shell环境中执行脚本:
. script_name
Run Code Online (Sandbox Code Playgroud)
或者,它更具可读性但特定于shell的别名source:
source script_name
Run Code Online (Sandbox Code Playgroud)
这避免了子shell,并允许任何变量或内置(包括cd)来影响当前的shell.
Jon*_*ler 37
Jeremy Ruten使用符号链接的想法触发了一个没有超越任何其他答案的想法.使用:
CDPATH=:$HOME/projects
Run Code Online (Sandbox Code Playgroud)
前导结肠很重要; 这意味着如果当前目录中有一个目录'dir',那么' cd dir'将更改为该目录,而不是在其他地方跳转.如图所示设置值,您可以:
cd java
Run Code Online (Sandbox Code Playgroud)
并且,如果当前目录中没有名为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
Run Code Online (Sandbox Code Playgroud)
小智 25
我通过使用我的代码工作. <your file name>
./<your file name> 不起作用,因为它不会改变终端中的目录,只是更改特定于该脚本的目录.
这是我的计划
#!/bin/bash
echo "Taking you to eclipse's workspace."
cd /Developer/Java/workspace
Run Code Online (Sandbox Code Playgroud)
这是我的终端
nova:~ Kael$
nova:~ Kael$ . workspace.sh
Taking you to eclipe's workspace.
nova:workspace Kael$
Run Code Online (Sandbox Code Playgroud)
Ser*_*ndt 24
exec bash末bash脚本在其当前环境或其子环境上运行,但从不在其父环境中运行.
但是,这个问题经常被问到,因为在从另一个目录执行bash脚本之后,想要在某个目录中保留bash提示符.
如果是这种情况,只需在脚本末尾执行子bash实例:
#!/usr/bin/env bash
cd /home/tree/projects/java
exec bash
Run Code Online (Sandbox Code Playgroud)
Dan*_*wak 12
当您触发shell脚本时,它会运行该shell 的新实例(/bin/bash).因此,您的脚本只会启动一个shell,更改目录并退出.换句话说,cd(和其他此类命令)在shell脚本中不会影响也无法访问启动它们的shell.
wor*_*mer 10
在我的特定情况下,我需要太多次来更改同一目录.所以在我的.bashrc(我使用ubuntu)我添加了
1 -
$ nano~./bashrc
function switchp
{
cd /home/tree/projects/$1
}
Run Code Online (Sandbox Code Playgroud)
2-
$ source~/.bashrc
3 -
$ switchp java
它会直接执行:cd/home/tree/projects/java
希望有所帮助!
你可以这样做:
#!/bin/bash
cd /your/project/directory
# start another shell and replacing the current
exec /bin/bash
Run Code Online (Sandbox Code Playgroud)
编辑:这也可以"点缀",以防止后续shell的创建.
例:
. ./previous_script (with or without the first line)
Run Code Online (Sandbox Code Playgroud)
您可以组合别名和脚本,
alias proj="cd \`/usr/bin/proj !*\`"
Run Code Online (Sandbox Code Playgroud)
只要脚本回显目标路径.请注意,这些是围绕脚本名称的反引号.
例如,您的脚本可能是
#!/bin/bash
echo /home/askgelal/projects/java/$1
Run Code Online (Sandbox Code Playgroud)
这种技术的优点是脚本可以采用任意数量的命令行参数,并发出可能由复杂逻辑计算的不同目的地.
您可以结合使用Adam&Greg的别名和点式方法来制作更具动感的内容 -
alias project=". project"
Run Code Online (Sandbox Code Playgroud)
现在运行项目别名将在当前shell中执行项目脚本而不是子shell.
在您的〜/ .bash_profile文件中。添加下一个功能
move_me() {
cd ~/path/to/dest
}
Run Code Online (Sandbox Code Playgroud)
重新启动终端,您可以键入
move_me
Run Code Online (Sandbox Code Playgroud)
然后您将被移至目标文件夹。
| 归档时间: |
|
| 查看次数: |
594746 次 |
| 最近记录: |