zsh 点的别名(graphviz)

zsh alias for dot (graphviz)

我正在尝试创建一个 zsh 别名,当它被调用时:

dott file.dot

会 return 一个 file.png 文件。到目前为止我失败的尝试是:

alias dott=dott() { dot -Tpng "$.dot" -o "$.png" ; }

但这不起作用。

到目前为止我的方法并不完美但有效:

 dott() { dot -Tpng "$@" -o "$@.png" ; }

唯一剩下的就是 file.dot.png 但这是可以接受的。如果您知道如何去掉 .dot,请告诉我

您只需编写一个函数,例如

function dott {
   dot -Tpng "" "$(echo |sed 's/dot$/png/')"
}

然后像程序一样调用它

dott infile.dot

由于您需要多次使用参数并且在命令末尾以外的其他地方使用,别名将不起作用。相反,你应该使用一个函数:

dott() {
    dot -T png "" -o "${1%.dot}.png"
}

你可以将它与

一起使用
dott file.dot

解释:

  • dott() 声明了一个名为 dott 的函数,其方式应该与大多数符合 POSIX 的 shells(bashzshdash、……)。一些 shells(bashzsh)也允许使用它们自己的 function 关键字定义函数:function dott。这并不适用于所有地方,例如 dash.
  • {...}括号中的命令列表称为复合命令,调用命令时会执行。
  • </code> 是您传递给函数的第一个参数。</li> <li><code>"" 如果参数包含空格,则需要 </code> 周围的双引号。 <strong>注意:</strong> 在 <code>zsh 中不需要引号,除非设置了 shell 选项 SH_WORD_SPLIT(默认情况下不是这种情况)。
  • ${1%.dot}:如果 </code> 的值以 <em><code>.dot 结尾,则用 的值代替.dot 已删除(file.dotfile)。如果它不以 .dot 结尾,则值将被替换为不变的 (file.datfile.dat)。这适用于所有符合 POSIX 的 shell(bashzshdash、...)。
  • "${1%.dot}.png".png 附加到替换的输出文件名,无论它最初以 .dot[=103 结尾=] 或不 (file.dotfile.png, file.dat -> file.dat.png)。同样,需要双引号来解释可能的空格。

如果您经常需要转换多个文件,您可以扩展该功能以允许多个文件名:

dott() {
    for file in "$@"; do
        dot -Tpng "$file" -o "${file%.dot}.png"
    done
}

这可以与

一起使用
dott file1.dot file2.dot file3.dot

当然它也适用于单个文件。

解释(仅更改):

  • $@ 是传递给函数的所有位置参数的完整列表。
  • "$@" 以每个参数扩展为单独的 的方式扩展。相当于"" "" "" ...注意:双引号在zsh中是可选的,即使设置了选项SH_WORD_SPLIT
  • for file in "$@"; do COMMAND-LIST; done"$@" 的每个元素运行 COMMAND-LIST。在循环内,可以通过名称 $file.
  • 访问当前元素