我只想编写一个可以更改目录的脚本。
我将以下命令放在文件中 /home/alex/pathABC
#!/bin/sh
cd /home/alex/Documents/A/B/C
echo HelloWorld
我做到了chmod +x pathABC。
在终端中,在中/home/alex,我运行./pathABC,但输出仅为HelloWorld,当前目录未更改。
那怎么了?
我只想编写一个可以更改目录的脚本。
我将以下命令放在文件中 /home/alex/pathABC
#!/bin/sh
cd /home/alex/Documents/A/B/C
echo HelloWorld
我做到了chmod +x pathABC。
在终端中,在中/home/alex,我运行./pathABC,但输出仅为HelloWorld,当前目录未更改。
那怎么了?
Answers:
正如其他人所解释的那样,目录是在脚本的子进程中更改的,而不是在从中调用脚本的终端进程中更改的。子进程死亡后,您将返回到原来的终端。
几种选择:
1.符号链接
将符号链接放在您要轻松访问的长途之家中
$ ln -s /home/alex/Documents/A/B/C ~/pathABC
然后使用以下命令访问目录:
$ cd ~/pathABC
2.别名
在您的〜/ .bashrc中放置一个别名:
alias pathABC="cd /home/alex/Documents/A/B/C"
(从这里开始)
3.功能
创建一个更改目录的函数,该函数将在终端进程中运行,然后可以更改其目录。
(从这里开始)
4.避免小时候跑
编写脚本而不是运行脚本。源(由.或完成source)导致脚本在同一外壳中执行,而不是在其自己的子外壳中运行。
$ . ./pathABC
5. CD-able vars
在中设置cdable_vars选项,~/.bashrc并在目录中创建一个环境变量:
shopt -s cdable_vars
export pathABC="/home/alex/Documents/A/B/C"
那你可以用 cd pathABC
(从这里开始)
source!我一直想知道为什么我做的source .bashrc,而不是bash .bashrc
cd $pathABC吗?
因为hello world只是一个trace语句,所以让我们尝试一下:
创建cd.sh包含以下内容的bash脚本文件:
#!/bin/bash
echo "/home/mike/Documents/A/B/C"
.sh扩展名是bash脚本文件名的扩展名的较早约定。这纯粹是化妆品,通常是不必要的。但是,在这种情况下,与核心cd命令区分开是很重要的。使用以下命令将bash脚本文件标记为可执行文件:
chmod a+x cd.sh
现在运行文件:
$ cd $(./cd.sh)
bash: cd: /home/alex/Documents/A/B/C: No such file or directory
cd 我们都知道。$(...) 在括号内执行命令并返回输出。cd.sh在您的路径中,则无需指定路径。我们以前缀./来指定命令在当前目录中。echo输出cd.sh通过传递回父级$(...)。父级(我们的shell提示)使用此输出,并将其传递给Linux cd命令。正如其他人提到的那样,子进程无法更改父目录。这是孩子在程序结束后可以告诉父母去哪里的一种方法。
14.04大概是一个小时左右前我读到的您的版本?
cd /home/mike/Documents/A/B/C,它不会产生任何输出。现在是echo "/home/mike/Documents/A/B/C",它会产生输出。
./cd.sh现在cd $(./cd.sh),它不再是一个简单的方法,而是实现了子级更改父级当前目录的目标。是的,这是非常规的,但我希望人们能从中发现乐趣,这是另一种方式。