Bash 函数似乎无法接受其中包含空格的目录

Bash 函数似乎无法接受其中包含空格的目录

我创建了以下函数~/.bashrc

function cl {cd $1; echo $1; ls -al $1}

(我将 echo 命令放在那里只是为了查看它实际读取的内容)

在我的主目录中,我创建了一个名为“示例文件夹”的文件夹,并尝试了cl "example folder"和。他们都打印出同样的东西:cl example\ foldercl ~/"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可能会因此而窒息)。要不带参数调用cdifcl不带参数调用(这样cl就可以将您带到主目录并列出那里的文件),您可以将"$1"其替换为${1+"$1"}.或者您可以使用与使用接收到的cd相同参数列表进行调用,因此您可以执行例如或。cl"$@"cl -P ../bincl -- -dir-whose-name-starts-with-dash

然后,您可能希望在之后打印当前工作目录,cd而不是使用第一个参数printf '%s\n' "$PWD"或仅打印第一个参数pwd

cl() {
  cd "$@" || return
  pwd
  ls -Al
}

更多阅读:

相关内容