为什么“ cd”在shell脚本中不起作用?
我正在尝试编写一个小脚本以将当前目录更改为我的项目目录:
#!/bin/bash
cd /home/tree/projects/java
我将此文件另存为proj,并使用chmod
添加了执行权限,然后将其复制到/usr/bin
。 当我通过以下方式调用它时: proj
,它什么都不做。 我究竟做错了什么?
#1楼
在我的特殊情况下,我需要太多次才能更改同一目录。 因此,在我的.bashrc(我使用ubuntu)上,我添加了
1-
$ nano〜。/ bashrc
function switchp{cd /home/tree/projects/$1}
2
$ source〜/ .bashrc
3-
$ switchp java
直接可以执行:cd / home / tree / projects / java
希望有帮助!
#2楼
我使用来使代码工作. <your file name>
. <your file name>
./<your file name>
无效,因为它不会更改终端中的目录,而只会更改特定于该脚本的目录。
这是我的程序
#!/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$
#3楼
如果您将鱼用作外壳,最好的解决方案是创建一个函数。 例如,给定原始问题,您可以复制下面的4行并将其粘贴到fish命令行中:
function projcd /home/tree/projects/java
end
funcsave proj
这将创建函数并保存以供以后使用。 如果您的项目发生更改,只需使用新路径重复该过程即可。
如果愿意,可以执行以下操作来手动添加功能文件:
nano ~/.config/fish/functions/proj.fish
并输入文字:
function projcd /home/tree/projects/java
end
最后按ctrl + x退出,然后按y,然后按回车键以保存更改。
( 注意:使用funcsave的第一种方法将为您创建proj.fish文件。 )
#4楼
您可以使用运算符&&:
cd myDirectory && ls
#5楼
如果以反斜杠结束行,则可以在同一子Shell中执行一些行。
cd somedir; \
pwd
#6楼
在您的〜/ .bash_profile文件中。 添加下一个功能
move_me() {cd ~/path/to/dest
}
重新启动终端,您可以键入
move_me
然后您将被移至目标文件夹。
#7楼
我有一个名为p的简单bash脚本,用于管理目录更改
github.com/godzilla/bash-stuff
只需将脚本放入本地bin目录(/ usr / local / bin)
并把
alias p='. p'
在你的.bashrc中
#8楼
采购要运行的脚本是一种解决方案,但应注意,此脚本可以直接修改当前Shell的环境。 同样,不可能再传递参数了。
另一种方法是在bash中将脚本实现为函数。
function cdbm() {cd whereever_you_want_to_goecho "Arguments to the functions were $1, $2, ..."
}
autojump使用了此技术: http ://github.com/joelthelion/autojump/wiki为您提供学习Shell目录书签。
#9楼
您可以使用.
在当前的shell环境中执行脚本:
. script_name
或者,其更具可读性但特定于Shell的别名source
:
source script_name
这样可以避免使用subshell,而是允许任何变量或内建函数(包括cd
)影响当前的shell。
#10楼
cd
在脚本的shell中完成。 脚本结束时,该外壳程序退出,然后将您留在原来的目录中。 “来源”脚本,不要运行它。 代替:
./myscript.sh
做
. ./myscript.sh
(请注意脚本名称前的点和空格。)
#11楼
Shell脚本在一个子Shell中运行,每个子Shell对当前目录都有自己的概念。 cd
成功,但是一旦子shell退出,您就回到了交互式shell中,那里什么也没有改变。
解决此问题的一种方法是改用别名:
alias proj="cd /home/tree/projects/java"
#12楼
你没做错什么! 您已经更改了目录,但仅在运行脚本的子外壳中进行了更改。
您可以使用“点”命令在当前进程中运行脚本:
. proj
但是我更希望格雷格的建议在这种简单情况下使用别名。
#13楼
当您启动shell脚本时,它将运行该shell的新实例( /bin/bash
)。 因此,您的脚本仅启动外壳程序,更改目录并退出。 换句话说,shell脚本中的cd
(和其他此类命令)不影响也不具有对其启动时所在的shell的访问权。
#14楼
它仅更改脚本本身的目录,而当前目录保持不变。
您可能要改用符号链接 。 它允许您对文件或目录创建“快捷方式”,因此您只需键入cd my-project
。
#15楼
您可以执行以下操作:
#!/bin/bash
cd /your/project/directory
# start another shell and replacing the current
exec /bin/bash
编辑:这也可以被“点缀”,以防止后续壳的创建。
例:
. ./previous_script (with or without the first line)
#16楼
杰里米·鲁滕(Jeremy Ruten)使用符号链接的想法引发了一个没有其他答案的想法。 采用:
CDPATH=:$HOME/projects
冒号很重要。 这意味着如果当前目录中存在目录“ dir”,则“ cd dir
”将更改为该cd dir
,而不是跳到其他位置。 按照所示设置值,您可以执行以下操作:
cd java
并且,如果当前目录中没有名为java的子目录,那么它将直接带您进入$ HOME / projects / java-没有别名,没有脚本,没有可疑的exec或dot命令。
我的$ 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
#17楼
快速浏览目录,有$ CDPATH,cdargs和自动生成别名的方法
http://jackndempsey.blogspot.com/2008/07/cdargs.html
http://muness.blogspot.com/2008/06/lazy-bash-cd-aliaes.html
https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-5827311.html
#18楼
您可以结合使用别名和脚本,
alias proj="cd \`/usr/bin/proj !*\`"
前提是脚本回显目标路径。 请注意,这些是脚本名称周围的反引号。
例如,您的脚本可能是
#!/bin/bash
echo /home/askgelal/projects/java/$1
这种技术的优点是脚本可以采用任意数量的命令行参数,并发出可能由复杂逻辑计算出的不同目标。
#19楼
制作一个bash脚本,将其cd到选择目录:
创建脚本文件
#!/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即可。
#20楼
最后使用exec bash
bash脚本在其当前环境或其子级环境上运行,但绝不在其父级环境上运行。
但是,经常会问这个问题,因为一个人想在另一个目录中执行 bash脚本后 , 留在某个目录中的(新)bash提示符下 。
如果是这种情况,只需在脚本末尾执行一个子bash实例 :
#!/usr/bin/env bash
cd /home/tree/projects/java
exec bash
#21楼
您可以在.bash_profile
创建如下所示的函数,它将正常运行。
以下函数采用一个可选参数,该参数是一个项目。 例如,您可以运行
cdproj
要么
cdproj project_name
这是函数定义。
cdproj(){dir=/Users/yourname/projectsif [ "$1" ]; thencd "${dir}/${1}"elsecd "${dir}"fi
}
不要忘记来源您的.bash_profile
#22楼
您不需要脚本,只需设置正确的选项并创建环境变量。
shopt -s cdable_vars
您的~/.bashrc
中的cd
允许cd
到环境变量的内容。
创建这样的环境变量:
export myjava="/home/tree/projects/java"
您可以使用:
cd myjava
其他选择 。
#23楼
只需运行:
cd /home/xxx/yyy && command_you_want
#24楼
使用Bash配置文件功能:
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
来快速编辑/创建这些文件
脚本示例
用cdd
制作cd ..
快捷方式
cdd() {cd ..
}
ls捷径
ll() {ls -l -h
}
ls捷径
lll() {ls -l -h -a
}
如何 :
在文件末尾复制函数并重新启动终端,然后可以运行cdd
或编写的任何函数
#25楼
这应该做您想要的。 转到感兴趣的目录(从脚本内),然后生成一个新的bash shell。
#!/bin/bash# saved as mov_dir.sh
cd ~/mt/v3/rt_linux-rt-tools/
bash
如果运行此命令,它将带您到感兴趣的目录,并且在退出时将带您回到原始位置。
root@intel-corei7-64:~# ./mov_dir.shroot@intel-corei7-64:~/mt/v3/rt_linux-rt-tools# exit
root@intel-corei7-64:~#
退出时,这甚至可以带您回到原始目录( CTRL + d )
#26楼
注意讨论如何设置父进程的工作目录?
它包含一些令人毛骨悚然的答案,例如https://stackoverflow.com/a/2375174/755804 (通过gdb更改父进程目录,请不要这样做)和https://stackoverflow.com/a/51985735/755804 (该命令tailcd
将cd目录名注入父进程的输入流;嗯,理想情况下,它应该是bash的一部分,而不是hack)
#27楼
LOOOOOng时间过后,但我做了以下事情:
创建一个名为case的文件
将以下内容粘贴到文件中:
#!/bin/shcd /home/"$1"
保存然后:
chmod +x case
我还在.bashrc
创建了一个别名:
alias disk='cd /home/; . case'
现在,当我键入:
case 12345
本质上我在输入:
cd /home/12345
您可以在“ case”之后输入任何文件夹:
case 12case 15case 17
就像输入:
cd /home/12cd /home/15cd /home/17
分别
在我的情况下,路径要长得多-这些家伙更早地用〜信息对其进行了总结。
#28楼
脚本中的cd
从技术上来说可以正常运行,因为它更改了运行脚本的shell的目录,但这是与交互式shell分开的一个独立过程。
解决此问题的Posix兼容方法是定义Shell过程而不是Shell调用命令脚本 。
jhome () {cd /home/tree/projects/java
}
您可以只输入它或将其放在各种Shell启动文件之一中。
#29楼
您可以将Adam&Greg的别名和点方法结合起来,以制作出更具动态感的内容-
alias project=". project"
现在运行项目别名将在当前外壳程序(而不是子外壳程序)中执行项目脚本。
为什么“ cd”在shell脚本中不起作用?相关推荐
- Linux shell脚本中分号的作用
日常工作中有时候会需要用到shell脚本来简化重复性工作. 然后每次都迷惑在什么地方改用分号,什么地方不用.好吧今天,来个了断吧. 首先我的需求是,判断有没有指定目录,如果没有则git clone 一 ...
- shell脚本中的冒号作用
今天看到一个shell脚本,有几行行代码是这样的: DATE="`date +%Y%m%d%H%M%S`" cp /boot/grub/grub.conf /boot/grub/g ...
- shell脚本中获取当前所在目录地址
shell脚本中获取当前所在目录如下 #!/bin/bashwork_path=$(dirname $0) cd ${work_path} work_path=$(pwd) cd ${work_pat ...
- 69:shell脚本介绍 | shell脚本结构 | 执行data命令用法 | shell脚本中变量
2019独角兽企业重金招聘Python工程师标准>>> 1.shell脚本介绍: shell是一种脚本语言和传统的开发语言相比,会比较简单: shell有自己语法,可以支持逻辑判断. ...
- shell脚本中一些特殊符号
shell脚本中一些特殊符号 在shell中常用的特殊符号罗列如下: # ; ;; . , / \\ 'string'| ! $ ${} $? $$ $* \"strin ...
- shell脚本中执行命令_如何在Shell脚本中执行命令?
shell脚本中执行命令 Shell is a command-line interpreter that allows the user to interact with the system. I ...
- shell脚本for循环_了解Shell脚本中的for循环
shell脚本for循环 Continuing on from our previous tutorials, let's understand the for loop in shell scrip ...
- linux判断文件类型是否存在脚本,shell脚本中的逻辑判断 文件目录属性判断 if特殊用法 case判断...
一.shell脚本中的逻辑判断 在shell脚本中,很多都会逻辑判断,判断某一个数值,判断某一个文件,或者某一个目录,我们针对判断结果再做一些操作,如果没有判断,就没法做一些操作 格式1:if条件:t ...
- shell脚本中的export和PWD的作用
shell脚本中的export和PWD的作用 (1)export 功能说明:设置或显示环境变量. 语法:export [-fnp][变量名称]=[变量设置值]. 补充说明:在shell中执行程序时,s ...
最新文章
- redisson 集合使用示例(RList、Rset、RMap)
- 【FBA】SharePoint 2013自定义Providers在基于表单的身份验证(Forms-Based-Authentication)中的应用...
- centos 7 mysql图形界面_centos7-vnstat图形界面搭建
- 150 Evaluate Reverse Polish
- java 鼠标精灵_纯Java实现跨平台鼠标键盘模拟、找图找色,Java版按键精灵
- codeblocks printf函数打印不出来_最全C语言基本程序交互函数之输出到屏幕
- JavaScript数据结构——队列(Queue)
- 使用ADO.NET轻松操纵数据库(二)
- python oop 实践_Python OOP示例?
- 汇编语言32位加减乘除运算题
- 自定义Java规则 Sonar
- python去重txt文本_Python文本去重
- 利用U盘制作虚拟软驱加载raid驱动
- 想做合格的产品经理,你需要这个证书
- Kalman详尽原理介绍合集
- IDEA中如何引入jama.jar包
- 魅族手机刷linux系统下载,把Ubuntu版魅族PRO 5刷成安卓系统
- Python 实现大连海事校园网登录
- 注册 Apple 企业开发者账号,您需要遵循以下步骤:
- 李忠汇编语言-初学-第四天
热门文章
- 算法------------存在重复元素 II(Java 版本)
- Guice:最好用的依赖注入框架
- CentOS 7.0系统安装配置图解教程
- ( Android-大神博客)
- swift_046(Swift map,filter, reduce方法)
- swift_041(Swift的@noescape和@escaping)
- matlab处理图片建系,求MATLAB处理一张图片,把图片放入坐标系,建立类似于经纬度的网格...
- PHP绕过disable_function限制(一)
- instanceof 实现
- AutoML初创公司探智立方:模型的物竞天择与适者生存