直接在命令行上工作,但在 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 */
这是命令,我正在尝试在 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 */
.
ls
但是,这里根本不需要循环;与大多数采用文件名参数的 Unix 实用程序一样,du 接受任意数量的参数:du -sh */