如何为cd和ls创建别名?


32

ls在运行命令后经常运行该cd命令。如何cs为此操作创建别名(如)?

Answers:


35

来自Bash技巧和窍门:带有样式的“ cd”

最后,我想向您展示如何编写“ cd”命令的自定义替换。

您是否发现自己在切换到目录时总是键入相同的内容?您可能至少每次都在此处列出文件,也许是如此之多,以至于您的手会在每个“ cd”之后自动键入“ ls”。

好吧,通过尝试我能想到的所有方法,事实证明只有一种方法可以正确地实现我们所追求的目标。我们必须创建一个shell函数。

Shell函数是Shell编程的一部分。像在编译的编程语言中一样,函数提供了一种过程模块化性。可以创建一个通用函数,以使用不同的参数执行经常使用的逻辑或计算。在这种情况下,该参数是当前工作目录。

这是一个简单的例子:

function cs () {
    cd $1
    ls
}

正如@geirha正确指出的那样,如果您尝试切换到名称中带有空格的目录,则上述功能将失败:

$ cs A\ B/
-bash: cd: A: No such file or directory
<current directory listing>  

您应该改为使用以下功能:

function cs () {
    cd "$@" && ls
    }

将代码添加到中后~/.bashrc,您应该可以执行以下操作:

hello@world:~$ cs Documents/
example.pdf tunafish.odt
hello@world:~/Documents$

1
对于包含空格的目录,它将失败。请参阅dv3500ea答案的评论。
geirha

24

您可以builtin在bash中使用命令:

function cd() {
    new_directory="$*";
    if [ $# -eq 0 ]; then 
        new_directory=${HOME};
    fi;
    builtin cd "${new_directory}" && ls
}

2
这很漂亮。我在.bashrc中有一个类似于@Florian的解决方案已经很长时间了,但是当我忘记了同事的计算机上没有我的'cs'别名时,这让我非常满意。
迪诺

我最喜欢这个答案。由于某种原因,您不能使用别名来覆盖命令,因此您必须创建一个类似于此答案的函数。:D
trusktr 2012年

但是非内置命令呢?例如,以上内容不适用于覆盖ls命令。是否有一些关键字可以代替“ builtin”使用?
trusktr 2012年

使用完整路径,例如:function ls() { /usr/bin/ls $* }
OneOfOne 2012年

我在重新定义时遇到了问题,cd因为也rvm更改了cd定义。参见stackoverflow.com/a/19941991/1601989
DavidG 2014年


9

感谢Florian Diesch使用函数的技巧。我无法使用cs该名称,因为csound软件包中有一个cs命令,因此我使用。lc

我将此添加到~/.bash_aliasesnano ~/.bash_aliases):

function lc () {
    cd $1;
    ls 
}

终端需要reset对此生效。


8
已经$1不带引号的喜欢,这将使它失败,如果该目录包含空格。另外,您应该检查cd; 的返回值。如果失败(例如,权限被拒绝),则没有任何必要运行lslc() { cd "$@" && ls; }
geirha

1

作为对此功能的扩展:cs() { cd "$1" && ls; },您可能希望cd通过使用$@而不是"$1"这样来传递函数的所有参数cs() { cd $@ && ls; }


1

我在重新定义时遇到了问题,cd因为也rvm更改了cd定义。参见https://stackoverflow.com/a/19941991/1601989。我真的不想使用它,builtin因为那样会跳过所有rvm操作。

我添加了以下内容.bashrc

# cdd allows you to cd to the directory of the given file or directory
function cdd()
{
  if [[ $# -eq 0 ]]; then
    cd
  elif [[ -d "$*" ]]; then
    cd "$*"
  elif [[ -f "$*" ]]; then
    echo "WARNING: file given, cd to file's dirname" 1>&2
    local dir=$(dirname "$*")
    cd "$dir"
  else
    cd "$*"
  fi
}

function cs()
{
  cdd $* && ls
}

再后rmv在该行.bashrc

alias cd='cdd'
# Use bash built in completion for cd to allow for filenames to be used
complete -r cd
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.