点的zsh别名(graphviz)

时间:2016-03-21 15:22:03

标签: command-line-interface zsh graphviz

我正在尝试创建一个名为:

的zsh别名
dott file.dot

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

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

但这不起作用。

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

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

唯一剩下的就是它会有file.dot.png,但这是可以接受的。如果你知道如何摆脱.dot请告诉我

2 个答案:

答案 0 :(得分:3)

由于您需要多次使用参数,并且在命令末尾以外的其他位置使用参数,因此别名将无效。相反,你应该使用一个函数:

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

您可以将其与

一起使用
dott file.dot

说明:

  • dott()以适合大多数符合POSIX标准的shell(dottbashzsh,...)的方式声明一个名为dash的函数。有些shell(bashzsh)也允许使用自己的function关键字定义函数:function dott。这无处不在,例如dash
  • {...}括起一个名为复合命令的命令列表,它将在调用该命令时执行。
  • $1是您传递给函数的第一个参数。
  • "$1"如果参数包含空格,则需要$1周围的双引号。 注意:zsh中不需要引号,除非设置了shell选项SH_WORD_SPLIT(默认情况下不是这种情况)。
  • ${1%.dot}:如果$1的值以 .dot 结尾,则该值将替换为 .dot 已移除( file.dot file )。如果它未以 .dot 结尾,则值将被替换为未更改( file.dat file.dat ) 。这适用于所有符合POSIX标准的shell(bashzshdash,...)。
  • "${1%.dot}.png" .png 附加到替代输出文件名,无论它最初是否以 .dot 结尾( file.dot file.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

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

说明(仅更改):

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

答案 1 :(得分:1)

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

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

然后称之为程序

dott infile.dot