这是命令,我试图在bash上运行,它运行得很好。但是,当我别名并放入bashrc时,它抱怨语法错误。
alias dsh="for i in `ls -d */`;do echo $i; du -sh $i;done"
答案 0 :(得分:4)
在双引号内,反引号中的命令替换将立即由shell进行评估。明显的解决方法是切换到单引号,这会抑制这种情况。但是你可以避免反引号和useless ls
更简单,更优雅for i in */
。
但是,你根本不需要循环;像大多数带有文件名参数的Unix实用程序一样,du接受任意数量的它们:du -sh */
答案 1 :(得分:2)
基本上你需要使用单引号。否则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发布an answer此处显示使用find
有点过于复杂。他建议使用du -sh */
。对我来说这看起来是最好的方法。我会配合它。
答案 2 :(得分:2)
使用单引号而不是双引号而不是ls -d */
仅使用*/
:
alias dsh='for i in */;do echo "$i"; du -sh "$i"; done'