我想为“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 的原始二进制文件。