Jav*_*ran 9 shell bash cd-command
我想写一些代码来让我切换到一些我经常去的目录。说这个程序是mycd,/a/very/long/path/name是我要去的目录。
所以我可以简单地输入mycd 2而不是cd /a/very/long/path/name. 这里我假设mycd知道2是指那个/a/very/long/path/name。也可能有mycd 1, mycd 3, ... 等。
问题是我必须编写mycd一个 shell 脚本并输入. mycd 2来做所需的事情,否则脚本只会在子脚本中执行,这不会改变我真正关心的父 shell 的任何内容。
我的问题是:
我可以不使用它source吗?因为. mycd假设mycd必须是一个 shell 脚本,这也可能会引入一些我不想要的功能。
我可以用其他一些编程语言实现它吗?
gle*_*man 24
创建mycd一个函数,以便cd命令在您当前的 shell 中执行。将其保存在您的 ~/.bashrc 文件中。
function mycd {
if (( $# == 0 )); then
echo "usage: $FUNCNAME [1|2|3|...]"
return
fi
case $1 in
1) cd /tmp ;;
2) cd /a/very/long/path/name ;;
3) cd /some/where/else ;;
*) echo "unknown parameter" ;;
esac
}
Run Code Online (Sandbox Code Playgroud)
您不能从另一个进程更改 shell 的当前目录。只有进程本身可以更改自己的当前目录。这也适用于其他一些特征,例如环境变量和文件描述符。
实际上有可能chdir通过ptrace系统调用执行系统调用来影响另一个进程的当前目录,这就是调试器工作的原因。但是,如果进程维护了一些内部数据结构,必须与实际的当前目录保持一致,则程序很可能会崩溃。对于shell,这种方法没有机会奏效。
您需要安排您的代码由 shell 本身执行。正常的处理方式是将其设置为 shell 函数并将其存储在您的~/.bashrc. 如果这是不可能的,例如因为它是您想要分发的代码,请编写一个包含函数定义的 shell 源文件,并告诉人们让他们的交互式 shell 使用.命令读取您的文件。
正如您自己指出的那样,shell 脚本始终在子 shell 中执行,它不会影响其父 shell。
不过你可以...
alias mycd2='cd /a/very/long/path/name'让你的脚本1输出一个有效的 shell 命令......
#!/bin/bash
if [ "x$1" = "x2" ]
then
echo "cd /a/very/long/path/name"
fi
Run Code Online (Sandbox Code Playgroud)
...并执行其输出: $(mycd 2)
1:您可能想要使用case语句而不是if示例中的条件。