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(bash
、zsh
、dash
、……)。一些 shells(bash
、zsh
)也允许使用它们自己的 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.dot
→ file
)。如果它不以 .dot
结尾,则值将被替换为不变的 (file.dat
→ file.dat
)。这适用于所有符合 POSIX 的 shell(bash
、zsh
、dash
、...)。
"${1%.dot}.png"
将 .png
附加到替换的输出文件名,无论它最初以 .dot
[=103 结尾=] 或不 (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
当然它也适用于单个文件。
解释(仅更改):
$@
是传递给函数的所有位置参数的完整列表。
"$@"
以每个参数扩展为单独的 词 的方式扩展。相当于"" "" "" ...
。 注意:双引号在zsh
中是可选的,即使设置了选项SH_WORD_SPLIT
。
for file in "$@"; do COMMAND-LIST; done
对 "$@"
的每个元素运行 COMMAND-LIST
。在循环内,可以通过名称 $file
. 访问当前元素
我正在尝试创建一个 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(bash
、zsh
、dash
、……)。一些 shells(bash
、zsh
)也允许使用它们自己的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.dot
→file
)。如果它不以.dot
结尾,则值将被替换为不变的 (file.dat
→file.dat
)。这适用于所有符合 POSIX 的 shell(bash
、zsh
、dash
、...)。"${1%.dot}.png"
将.png
附加到替换的输出文件名,无论它最初以.dot
[=103 结尾=] 或不 (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
当然它也适用于单个文件。
解释(仅更改):
$@
是传递给函数的所有位置参数的完整列表。"$@"
以每个参数扩展为单独的 词 的方式扩展。相当于"" "" "" ...
。 注意:双引号在zsh
中是可选的,即使设置了选项SH_WORD_SPLIT
。for file in "$@"; do COMMAND-LIST; done
对"$@"
的每个元素运行COMMAND-LIST
。在循环内,可以通过名称$file
. 访问当前元素