Bash:用 ls -la 覆盖 ls -la | 更多(基本 bash 脚本问题)

Bash:用 ls -la 覆盖 ls -la | 更多(基本 bash 脚本问题)

对 bash 脚本来说还很陌生。尝试将 ls -la 命令改写为:ls -la | more

(对我来说似乎更有用)。

我把这个添加到我的末尾.bashrc

154 # alias 'ls -la'='ls -la | more'
155         # this did not work because aliases
156         # are not allowed to have spaces in
157         # them. => have to make function:
158 ls() {
159         if [[ $@ == "-la" ]];
160         then
161                echo "test";
162                 command ls -la | more;
163         else
164                 command ls "$@";
165         fi;
166 }

但是当我打开一个新终端时出现此错误:

bash: /users/me/.bashrc: line 158: syntax error near unexpected token `('
bash: /users/me/.bashrc: line 158: `ls() {'

当我添加function之前的内容时ls() {,没有任何投诉,但 ls 行为没有任何变化。谢谢。

更新

为了缩小问题范围,我这样做了:

159 ls() {
160         #if [[ $@ == "-la" ]];
161        # then
162                echo "test"
163 #               command ls -la | grep vim;
164         #else
165         #        command ls "$@";
166         #fi;
167 }

但我仍然得到同样的错误。我认为主要问题可能是它在bashrc文件中?

更新

奇怪的是,这有效

159 function ls() {
160         #if [[ $@ == "-la" ]];
161        # then
162                echo "test"
163 #               command ls -la | grep vim;
164         #else
165         #        command ls "$@";
166         #fi;
167 }

答案1

我无法在 Solaris 10 或 Cygwin 上的 Bash-3.00.16 上重现这个问题,但看起来你的 bash 将第 158 行解析为命令的调用ls,而不是函数定义。

“function”前缀是可选的,但如果它能让你的 bash 接受定义,那么这是一个合理的解决方法。它不会以任何方式改变函数的含义。

顺便问一下,您使用哪个操作系统和 Bash 版本?

uname -a
bash --version

答案2

我知道这不是您要问的,但我提到它以防您没有考虑过这种解决方案。根据我的经验,解决这个问题的通常方法是创建一个没有空格的别名,例如:

alias llm="ls -la | more"

这比编写脚本要快得多,也容易得多。FWIW,我在运行 Bash 3.0 的 FreeBSD 5.3 系统上对此进行了测试,它提供了更多列表。

答案3

用。。。来代替:

函数 ls
 {
         如果 [[ $@ == "-la" ]]
         然后
                回显“测试”
                /bin/ls -la | 更多
         别的
                /bin/ls“$@”
         科幻;     
}

注意:您需要在 if 中引用实际 ls 命令的绝对路径,否则将重新调用相同的函数......stackoverflow!:-)

编辑:是的,命令关键字是防止别名查找的更好方法。

相关内容