是否可以从脚本更改当前目录?

我想在 Bash 中创建一个用于目录导航的实用程序。我创建了一个测试脚本,如下所示:

#!/bin/bash
cd /home/artemb

当我从 Bash shell 执行脚本时,当前目录不会更改。是否可以通过脚本更改当前的 shell 目录?

有帮助吗?

解决方案

您需要将您的脚本转换为外壳功能:

#!/bin/bash
#
# this script should not be run directly,
# instead you need to source it from your .bashrc,
# by adding this line:
#   . ~/bin/myprog.sh
#

function myprog() {
  A=$1
  B=$2
  echo "aaa ${A} bbb ${B} ccc"
  cd /proc
}

原因是,每个进程都有自己的当前目录中,当你从shell执行程序是在一个新的进程中运行。标准的“CD”,“PUSHD”和“POPD”,使它们所影响的外壳进程被内置于壳解释器。

这是使你的程序的外壳功能,您要添加自己的过程中的命令,然后任意目录变化被反映在shell进程。

其他提示

当您启动脚本,创建一个新的过程,既继承了您的环境。当它结束时,它结束。您当前的环境保持原样。

相反,你就可以开始你的脚本是这样的:

. myscript.sh

.将评估在当前环境中的脚本,所以它可能被修改

鉴于答案不可读且过于复杂,我认为这是请求者应该做的

  1. 将该脚本添加到 PATH
  2. 将脚本运行为 . scriptname

. (点)将确保脚本不在子 shell 中运行。

把上述在一起,就可以使一个别名

alias your_cmd=". your_cmd"

如果你不想写领先“”每一次 你想你的脚本源的shell环境, 或者如果你只是不想记住,一定要做 为脚本才能正常工作。

如果你正在使用bash,那么你可以尝试别名:

到.bashrc文件添加此行:

alias p='cd /home/serdar/my_new_folder/path/'

当你写的“p”在命令行上,它会改变的目录。

如果您运行bash脚本,那么它将运行在其当前的环境或它的那些孩子,从来没有父。

如果目标是运行命令: goto.sh /家/测试 然后进行交互式工作在/ home /测试的一种方法是在脚本中运行bash的交互式子shell:

#!/bin/bash
cd $1
exec bash

此方式,您将在/ home /测试,直到这个外壳在退出(退出或Ctrl + C)。

使用的 PUSHD 当前目录被推目录栈上,并将其改变为给定的目录,的 POPD 获取在堆叠和变化的顶部的目录,然后到它

pushd ../new/dir > /dev/null
# do something in ../new/dir
popd > /dev/null

只要到

yourusername/.bashrc (or yourusername/.bash_profile on MAC) by an editor

和下添加此代码到最后一行:

alias yourcommand="cd /the_path_you_wish"

然后退出编辑器。

然后输入:

source ~/.bashrc or source ~/.bash_profile on MAC.

现在可以使用: yourcommand 在终端

我做了一个脚本来更改目录。看一看: https://github.com/ygpark/dj

基本上我们用cd..来自每个目录回来。我想使通过给用,你需要再来一次目录的数量更容易。您可以使用使用alias命令一个单独的脚本文件实现这一点。例如:

<强> code.sh

#!/bin/sh
 _backfunc(){
 if [ "$1" -eq 1 ]; then
  cd ..
 elif [ "$1" -eq 2 ]; then
  cd ../..
 elif [ "$1" -eq 3 ]; then
  cd ../../..
 elif [ "$1" -eq 4 ]; then
  cd ../../../..
 elif ["$1" -eq 10]; then
  cd /home/arun/Documents/work
 fi
 }
alias back='_backfunc'   

在当前shell使用source code.sh后,可以使用:

$back 2 

来两步从当前目录回来。详细超过解释这里。它也是在那里解释如何把在〜/ .bashrc代码,以便打开每一个新外壳将自动获得这一新的alias命令。您可以添加新的命令,通过增加更多的if conditions和不同的参数修改代码去特定的目录。您也可以从拉过的git rel="nofollow">代码。

这种方法对我来说更容易。

假设在您是管理员的个人 iMac 上,在打开命令窗口时的默认目录 /Users/jdoe 下,这将是要转到的目录:/Users/jdoe/Desktop/Mongo/db.3.2.1/bin。

这些是可以完成工作的步骤:

  1. vi mongobin,我在其中输入:cd /Users/jdoe/Desktop/Mongo/db.3.2.1/bin 作为第一行。
  2. chmod 755 mongobin
  3. source mongobin
  4. pwd

瞧!

我还创建了一个名为的实用程序 山羊 您可以使用它来更轻松地导航。

您可以在以下位置查看源代码 GitHub.

作为 v2.3.1使用概述 看起来像这样:

# Create a link (h4xdir) to a directory:
goat h4xdir ~/Documents/dev

# Follow a link to change a directory:
cd h4xdir

# Follow a link (and don't stop there!):
cd h4xdir/awesome-project

# Go up the filesystem tree with '...' (same as `cd ../../`):
cd ...

# List all your links:
goat list

# Delete a link (or more):
goat delete h4xdir lojban

# Delete all the links which point to directories with the given prefix:
goat deleteprefix $HOME/Documents

# Delete all saved links:
goat nuke

# Delete broken links:
goat fix

我喜欢做不同的项目,同样的事情兵不血刃了一个新的外壳。

在你的情况:

cd /home/artemb

保存the_script为:

echo cd /home/artemb

,然后用火起来:

\`./the_script\`

然后你使用相同的外壳获得该目录。

添加下面的CD线在你的shell这样的:

exec $SHELL

<强>声明你的路径:

PATH='/home/artemb'     
cd ${PATH}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top