我创建了以下函数~/.bashrc
:
function cl {cd $1; echo $1; ls -al $1}
(我将 echo 命令放在那里只是为了查看它实际读取的内容)
在我的主目录中,我创建了一个名为“示例文件夹”的文件夹,并尝试了cl "example folder"
和。他们都打印出同样的东西:cl example\ folder
cl ~/"example folder"
-bash: cd: too many arguments
example folder
接下来是 ls 命令,它只列出我当前的目录。
那么,有办法解决这个问题吗?如何传入包含空格的目录?
答案1
function cl {cd $1; echo $1; ls -al $1}
比 bash 语法更接近 zsh 语法,但即便如此,仍然存在许多问题。
在bash
- 后面需要空格
{
,并且}
前面有命令分隔符(;
、&
、换行符,不过)
也可以)。不适用于 zsh。 - 参数扩展必须加引号,否则它们会经历 split+glob。不适用于 zsh。
- 如果您将变量数据传递为常规参数而不是选项,则应确保在其前面添加选项结束标记 (
--
),以避免以 开头的数据被视为选项-
。 cd
您没有在运行下一个命令后检查退出状态。echo
不能用于输出任意数据。代替使用printf
。cd
编辑后$1
,如果是相对路径,ls -la $1
(或更正确的ls -la -- "$1"
)将不再起作用。$1
最有可能的是你只想要ls -la
(或ls -lA
)。- 在脚本中,您通常希望
cd
与, 一起使用-P
,并在确保$CDPATH
未设置或为空 (CDPATH= cd -P -- "$1"
) 后使用,以便它的行为更像chdir()
任何其他语言的 。但如果要从交互式 shell 中使用该函数,则可能不适用。 function f { ...; }
是函数定义的 ksh 语法。在 中bash
,没有什么理由比标准f() { ...; }
语法更喜欢它。
所以:
cl() {
cd -- "$1" || return
printf '%s\n' "$1"
ls -Al
}
请注意,当未传递任何参数时,cd
会将目录更改为您的家目录(cd
类似于cd ~
或cd "$HOME"
)。
然而,在这里,当cl
不带参数调用时"$1"
,会扩展为一个空参数,而不是根本没有参数(并且cd
可能会因此而窒息)。要不带参数调用cd
ifcl
不带参数调用(这样cl
就可以将您带到主目录并列出那里的文件),您可以将"$1"
其替换为${1+"$1"}
.或者您可以使用与使用接收到的cd
相同参数列表进行调用,因此您可以执行例如或。cl
"$@"
cl -P ../bin
cl -- -dir-whose-name-starts-with-dash
然后,您可能希望在之后打印当前工作目录,cd
而不是使用第一个参数printf '%s\n' "$PWD"
或仅打印第一个参数pwd
。
cl() {
cd "$@" || return
pwd
ls -Al
}
更多阅读: