我正在尝试创建一个名为:
的zsh别名dott file.dot
会返回一个file.png文件。到目前为止,我失败的尝试是:
alias dott=dott() { dot -Tpng "$.dot" -o "$.png" ; }
但这不起作用。
到目前为止,我的方法并不完美但有效:
dott() { dot -Tpng "$@" -o "$@.png" ; }
唯一剩下的就是它会有file.dot.png,但这是可以接受的。如果你知道如何摆脱.dot请告诉我
答案 0 :(得分:3)
由于您需要多次使用参数,并且在命令末尾以外的其他位置使用参数,因此别名将无效。相反,你应该使用一个函数:
dott() {
dot -T png "$1" -o "${1%.dot}.png"
}
您可以将其与
一起使用dott file.dot
dott()
以适合大多数符合POSIX标准的shell(dott
,bash
,zsh
,...)的方式声明一个名为dash
的函数。有些shell(bash
,zsh
)也允许使用自己的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(bash
,zsh
,dash
,...)。"${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; done
为COMMAND-LIST
的每个元素运行"$@"
。在循环内部,当前元素可以通过名称$file
进行访问。答案 1 :(得分:1)
你只需编写一个函数,例如
function dott {
dot -Tpng "$1" "$(echo $1|sed 's/dot$/png/')"
}
然后称之为程序
dott infile.dot