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

时间:2017-06-09 21:40:23

标签: linux bash shell command-line

我试图为这个命令创建别名

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"

2 个答案:

答案 0 :(得分:4)

改为使用函数:

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

您可以在bash中更简单地将其写为

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

答案 1 :(得分:0)

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

1)你有两个带引号的字符串(标记),$file的扩展超出任何引号。这意味着当别名 set 时它将被展开,而不是在它被执行时展开。 (它也将从双引号内扩展)

2)反引号(以及saner $(...))从双引号内扩展,因此在设置别名时它们也会扩展。因此,如果在设置别名时$file恰好包含*,那么您就会得到您所看到的内容。

如果你想用别名做类似的事情,请在它周围使用单引号:

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

(或者更好的是,使用像@chepner这样的功能。)