我正在尝试编写一个小脚本,将当前目录更改为我的项目目录:
#!/bin/bash
cd /home/tree/projects/java
我将此文件保存为proj,使用chmod添加了执行权限,并将其复制到/usr/bin。当我呼叫它时:proj,它什么都不做。我做错了什么?
我正在尝试编写一个小脚本,将当前目录更改为我的项目目录:
#!/bin/bash
cd /home/tree/projects/java
我将此文件保存为proj,使用chmod添加了执行权限,并将其复制到/usr/bin。当我呼叫它时:proj,它什么都不做。我做错了什么?
当前回答
最后使用exec bash
bash脚本在其当前环境或其儿童,但决不依赖其父母环境。
然而,这个问题经常被问到,因为在从另一个目录中执行bash脚本之后,人们希望留在某个目录中的(新的)bash提示符处。
如果是这种情况,只需在脚本末尾执行一个子bash实例:
#!/usr/bin/env bash
cd /home/tree/projects/java
echo -e '\nHit [Ctrl]+[D] to exit this child shell.'
exec bash
要返回到上一个父bash实例,请使用Ctrl+D。
使现代化
至少在更新版本的bash中,不再需要最后一行的exec。此外,可以使用$shell环境变量使脚本与任何首选的shell一起工作。然后得出:
#!/usr/bin/env bash
cd desired/directory
echo -e '\nHit [Ctrl]+[D] to exit this child shell.'
$SHELL
其他回答
您可以使用运算符&&:
cd myDirectory&&ls
这将Serge的回答与David的不相关回答结合起来。它更改目录,然后启动用户的默认shell,而不是强制使用bash shell。然而,它需要getent和/etc/passwd来检测默认shell。
#!/usr/bin/env bash
cd desired/directory
USER_SHELL=$(getent passwd <USER> | cut -d : -f 7)
$USER_SHELL
当然,这仍然具有创建嵌套外壳的相同缺陷。
它只更改脚本本身的目录,而当前目录保持不变。
您可能希望改用符号链接。它允许您创建文件或目录的“快捷方式”,因此您只需键入cd my project之类的内容。
要制作一个bash脚本,该脚本将cd到select目录:
创建脚本文件
#!/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就可以了。
您可以组合别名和脚本,
alias proj="cd \`/usr/bin/proj !*\`"
前提是脚本回显目标路径。请注意,这些是脚本名称周围的反引号
例如,您的脚本可以是
#!/bin/bash
echo /home/askgelal/projects/java/$1
这种技术的优点是,脚本可以接受任意数量的命令行参数,并发出由可能复杂的逻辑计算的不同目的地。