繁体   English   中英

为包含单引号的命令创建别名

[英]Create alias for command containing single quotes

我试图为此命令创建别名

for file in *; do mv "$file" `echo $file | tr ' ' '_'` ; done

我正在使用此命令创建别名

alias renfiles="for file in *; do mv "$file" `echo $file | tr ' ' '_'` ; done"

但是它为错误的命令创建别名:

$ which renfiles
alias renfiles='for file in *; do mv * * ; done'

我想做的是创建一个重命名文件的别名,然后使用readlink列出它们,所以下面要做一个别名:

for file in *; do mv "$file" `echo $file | tr ' ' '_'` ; done
for f in *; do   readlink -f -- "$f"; done | sed -e "s/\/home\/ovh\/www/xxx.xxx.xxx.xxx/g"

改用一个函数:

renfiles () {
  for file in ./*; do
    mv "$file" "$(echo "$file" | tr ' ' '_')"
  done
}

您可以在bash更简单地编写为

renfiles () {
  for file in ./*; do
    mv "$file" "${file// /_}"
  done
}
alias renfiles="for file in *; do mv "$file" `echo $file | tr ' ' '_'` ; done"

1)您在那里有两个带引号的字符串(标记为), $file的扩展在任何引号之外。 这意味着,当,当它执行的别名设置 ,不是会扩大。 (它也会在双引号内扩展)

2)反引号(以及更清晰的$(...) )从双引号内部展开,因此在设置别名时它们也会被展开。 因此,如果在设置别名时$file恰好包含* ,那么您将得到的正是您所看到的。

如果要使用别名执行类似的操作,请在其周围使用单引号:

alias renfiles='for file in *; do echo mv "$file" $(echo $file | tr " " "_") ; done'

(或者更好的方法是,使用显示的@chepner之类的函数。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM