如何编写别名以使用第一个参数或*(如果参数为空)?

如何编写别名以使用第一个参数或*(如果参数为空)?

我想为“ls”编写一个别名命令,这样如果我传入一个参数,别名就会使用它,但如果我没有传入,它就会使用“*”。这是我现在的别名:

alias lsd='ls --color -lh | grep "^d" && ls --color -lh | grep -v "^d"

我的问题是,无论我输入什么命令lsd,我总是在响应中获得所有文件。因此,当我输入时lsd *.sh,我仍然会在列表中获得所有目录和文件。

我从另一个超级用户帖子中复制了这个别名,但还不太理解它。

谢谢你的帮助。

更新:好的,现在我已经在 .bashrc 文件中定义了这个函数:

function lsd() {
  if [[ -z $1 ]] ; then
    command ls --color -lh | grep "^d" && ls --color -lh | grep -v "^d"
  else
    command ls --color -lh "$1" | grep "^d" && ls --color -lh "$1" | grep -v "^d"
  fi
}

当我仅使用 运行它时lsd,它按我想要的方式工作。但是当我使用 运行它时lsd *.wav,我仍然会在输出中看到目录名称,然后我看到“二进制文件 x.wav 与输出匹配”。我做错了什么?

以防不清楚,我试图列出目录,然后列出文件,但只列出与命令中第一个参数匹配的文件。所以当我输入时lsd *.wav,我不希望看到目录,因为它们的名称不以 .wav 结尾。谢谢大家的帮助!:)

最后:没关系。我使用源 .bashrc 尝试更新 bash,但不起作用,所以旧命令仍在运行。我关闭了 ssh 会话并重新登录,这个新命令现在正在运行。谢谢大家!

答案1

别名不接受参数。如果您只想用短字符串替换长字符串,请使用别名。对于参数处理,请使用函数:

ls () {
    if [[ -z $1 ]] ; then
        command ls *
    else
        command ls "$@"
    fi
}

答案2

使用 -z 检查变量是否未设置。

alias ls='[ -z $1 ] && ls * || ls $*'

答案3

正如其他人所说,“别名”不会处理在调用“别名”命令的命令行上给出的命令行参数。它只是将所有命令行参数附加到末尾,从而将所有命令行参数传递给替换的命令。

以下是一个例子测试脚本来显示这种效果...

从这样的脚本开始:

[~]# cat /some...path/ls1.sh
#!/bin/sh

dollarpound="$1"
shift
dollarone="$1"
shift

echo ""
echo "dollarpound=\"$dollarpound\""
echo "dollarone=\"$dollarone\""
echo "\$*=\"$*\""
echo "\$@=\"$@\""
echo "\$1=\"$1\""
echo "\$2=\"$2\""
echo ""

if [ $# -eq 0 ]; then
  echo ls --color -lh *
else
  echo "ls --color -lh $*"
fi
echo ""
[~]#

然后,为该脚本指定一个别名:

[~]#alias lsx='/some...path/ls1.sh $# "$1"'
[~]#

调用别名lsx无参数:

[~]# lsx

dollarpound="0"
dollarone=""
$*=""
$@=""
$1=""
$2=""

ls --color -lh ant bat cat dog eel.txt fox.txt goat.jpg horse.jpg

[~]#

调用别名lsx带有 1 个参数:"*.txt"

[~]# lsx *.txt

dollarpound="0"
dollarone=""
$*="eel.txt fox.txt"
$@="eel.txt fox.txt"
$1="eel.txt"
$2="fox.txt"

ls --color -lh eel.txt fox.txt

[~]#

请注意,“别名”命令调用的脚本会报告0参数而不是1"*.txt"), 或者2"eel.txt", "fox.txt")。

调用别名lsx有 4 个参数:

[~]# lsx ant bat cat dog

dollarpound="0"
dollarone=""
$*="ant bat cat dog"
$@="ant bat cat dog"
$1="ant"
$2="bat"

ls --color -lh ant bat cat dog

[~]#

请注意,“别名”命令调用的脚本会报告0参数而不是4



因此,该脚本的工作版本是:

[~]# cat /some...path/ls2.sh
#!/bin/sh

if [ $# -eq 0 ]; then
  \ls --color -lh *
else
  \ls --color -lh $*
fi
[~]#

(注意\ls.这可以防止ls被其他“别名”等进一步取代……)。

为工作脚本指定别名:

# alias lsx='/some...path/ls2.sh'
[~]#

调用别名lsx无参数:

[~]# lsx
-rw-r--r-- 1 someuser someuser    0 Jan 21 02:42 eel.txt
-rw-r--r-- 1 someuser someuser    0 Jan 21 02:42 fox.txt
-rw-r--r-- 1 someuser someuser    0 Jan 21 02:42 goat.jpg
-rw-r--r-- 1 someuser someuser    0 Jan 21 02:42 horse.jpg

ant:
total 0

bat:
total 0

cat:
total 0

dog:
total 0
[~]

请注意,脚本检测到没有参数并运行"ls *"代替"ls"(无参数)。

调用别名lsx带有 1 个参数:"*.txt"

[~]# lsx *.txt
-rw-r--r-- 1 someuser someuser 0 Jan 21 02:42 eel.txt
-rw-r--r-- 1 someuser someuser 0 Jan 21 02:42 fox.txt
[~]

调用别名lsx有 4 个参数:

[~]# lsx ant bat cat dog
ant:
total 0

bat:
total 0

cat:
total 0

dog:
total 0
[~]#

如果您有理由想要使用“别名”来执行此操作,那么这应该适合您。只需为别名和脚本指定您喜欢的任何名称即可。例如,如果您想“别名”ls命令,使用alias ls='/some...path/ls2.sh'(使用脚本的路径和名称)。

另一方面,如果你想要这个命令有唯一的名称,比如lsx例如,只需为脚本赋予该名称,然后将脚本放在路径中包含的文件夹中,可能会更简单,例如:/bin/lsx或任何你喜欢的。

答案4

我想给命令添加别名,这样当它运行时我就可以做一些不同的事情。

例如,我希望

$ git push

在推送之前,先做了一些其他的事情。我知道我可能可以用 git 的方式来处理这个问题,但这是解决想要为命令及其参数设置别名的问题的通用解决方案。

我创建了一个像这样的别名,它指向一个 bash 脚本:

$ alias git="$HOME/bin/git"

然后我创建了一个 bash 脚本来拦截某些 git 调用

〜/ bin / git

#!/usr/bin/env bash

# avoid recursive calls to this bash script
if [ "$IN_GIT_BIN" != "true" ]; then

  # intercept calls to "git push", and do something 
  if [ "$1" == "push" ]; then
    shift;
    echo "using ~/bin/git ...."
    IN_GIT_BIN="true" do_extra_things "$@"
    exit;
  fi
fi

# if not intercepted, run original git command
/usr/local/bin/git "$@"

这使得我可以在它们中使用其他脚本git,并且它们不会使用我的 git 覆盖,而是使用 git 的原始二进制文件。

相关内容