直接在命令行上工作,但在 bash 中使用别名时会抱怨语法错误

works on commandline directly, but complaints syntax error when aliased in bash

这是命令,我正在尝试在 bash 上 运行,效果很好。但是当我使用别名并放入 bashrc 时,它会抱怨语法错误。

  alias dsh="for i in `ls -d */`;do echo $i; du -sh $i;done"

基本上你需要使用单引号。否则 ls -d */$i 会在您定义别名的 shell 中展开,而不是在您执行该别名的 shell 中展开。

alias dsh='for i in `ls -d */`;do echo "$i"; du -sh "$i";done'

但是,不建议迭代 ls 的结果。如果 ls 返回的文件夹名称包含空格,for i in 循环将无法正确处理它。这就是为什么我建议使用 find

alias dsh='find -maxdepth 1 -type d -exec du -sh {} \;'

请注意,du -sh 将打印文件夹名称。不需要进一步回显。


tripleee 在此处发布 表明使用 find 有点太复杂了。他建议使用du -sh */。这看起来对我来说是最好的方法。我会同意的。

使用单引号而不是双引号,并且只使用 */:

而不是 ls -d */
alias dsh='for i in */;do echo "$i"; du -sh "$i"; done'

在双引号内,反引号中的命令替换将立即由 shell 求值。明显的解决方法是切换到单引号,这会抑制这种情况。但是您可以使用更简单、更优雅的 for i in */.

来避免反引号和 useless ls

但是,这里根本不需要循环;与大多数采用文件名参数的 Unix 实用程序一样,du 接受任意数量的参数:du -sh */