目录中CD的别名并调用命令


21

我有一个.bash_profile,并且我有一组别名。目前,这些别名仅执行一个命令,这非常容易。但是,我想使用我要创建的新别名来做两件事。

  1. 光盘进入目录
  2. 从该目录运行命令

Answers:


26

要执行具有特定工作目录的命令,通常需要执行

( cd directory && utility )

括号内是cd ...指其中的命令在子外壳中运行。更改子外壳程序中的工作目录可以使它不更改调用程序外壳程序的当前工作目录,即,在调用此命令后,您仍将位于启动时所在的目录中。

例:

( cd / && echo "$PWD" )  # will output "/"
echo "$PWD"              # will output whatever directory you were in at the start

由于别名不能接受任何参数,因此不能将其转换为通用别名。

对于特定的目录和实用程序,可以执行

alias cdrun='( cd "$HOME/somedir" && ./script.sh )'

但对于一般情况,则必须使用shell函数:

cdrun () {
    ( cd "$1" && shift && command "$@" )
}

要么

cdrun () (
    cd "$1" && shift && command "$@"
)

用括号括住花括号,使函数在其自身的子外壳中执行。

这将用作

$ cdrun "$HOME/somedir" ./script.sh

它将运行script.sh位于目录中的脚本$HOME/somedir$HOME/somedir作为工作目录),或者

$ cdrun / ls -l

这将为您提供根目录的“长格式”目录列表。

shell函数使用其第一个参数,并尝试更改到该目录。如果可行,它将目录名称从位置参数(命令行参数列表)中移开,并执行其余参数给出的命令。command是外壳程序中的内置命令,仅将其参数作为命令执行。


如果要使用更改的工作目录执行命令则需要所有这些。如果您只想执行其他位置的命令,显然可以使用

alias thing='$HOME/somedir/script.sh'

但是这将运行script.sh位于$HOME/somedir当前目录作为工作目录。

在不更改工作目录的情况下执行位于其他位置的脚本的另一种方法是将脚本的位置添加到PATH环境变量中,例如

PATH="$PATH:$HOME/somedir"

现在script.sh$HOME/somedir只需使用即可在任何地方运行

$ script.sh

而且,这并不会改变该命令的工作目录。


2
优秀,全面的答案。我只是想我会提的是,函数定义只需要编组命令的一个方法和子shell括号足够:cdrun () ( cd "$1" && shift && command "$@" )
安东尼·G-莫妮卡的大法官

2
@AnthonyGeoghegan啊,是的。我总是使用{ ... }较长功能的一致性。
库萨兰达

这个问答似乎说明了我的情况,并且可能是在使用环境pushdpopd(也> /dev/null可以避免输出消息的同时)的一种改进,同时还使上下文保持了干净!
普西斯(Pysis)'17年

1
@Pysis是的,(cd dir && thing)它比使用pushd和更可移植popd
库萨兰达

@Kusalananda真的吗?我让他们至少可以在几个系统上工作。
普西斯(Pysis)'17年

4
alias <name-of-the-alias>='cd <the-directory> && <command>'

因此,如果要将目录(cd)更改为文件夹/var/log/,然后列出(ls)其文件,则可以在.bash_profile文件中追加以下内容:

alias logs='cd /var/log/ && ls'

1

我使用此功能在不同目录中运行单个命令:

cd1 () {
  if [ $# -eq 1 ]; then
    command cd -- "$1"
  else
    ( command cd -- "$1" && shift && "$@" )
  fi
}

此功能的局限性在于通配符是相对于原始目录而不是相对于命令运行的目录而言完成的。在zsh中可以做得更好

cd如果使用单个参数调用,则此函数的行为类似于普通函数,因此您可能需要调用它cd。(此功能不支持任何选项,但cd很少使用to 。)


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.