使用进程替换执行svnadmin setrevprop失败求助
问题原因与解决方案
这个问题的核心是你误解了svnadmin setrevprop的参数用法以及进程替换的作用方式,让我拆解清楚:
为什么你的命令会失败?
当你执行:
svnadmin setrevprop -r1 MyRepoDir svn:author <(echo -n NewAuthor)
这里的<(echo -n NewAuthor)是bash的进程替换语法,它会创建一个临时伪文件(比如/dev/fd/63),并把这个伪文件的路径作为位置参数直接传递给svnadmin。但svnadmin setrevprop的规则是:
- 如果最后一个参数是字符串,它会直接把这个字符串设为属性内容;
- 只有省略属性值参数时,它才会从标准输入(stdin)读取内容。
你的命令相当于让svnadmin把作者名设为那个伪文件的路径字符串,但svnadmin对这类特殊路径做了过滤或解析出错,最终导致属性值被设为空。
而你用真实文件时能成功,大概率是因为你用了正确的读取方式——比如用-F参数指定文件,或者通过输入重定向让svnadmin从stdin读取文件内容。
正确的两种写法
要让进程替换配合svnadmin setrevprop正常工作,你有两种选择:
1. 使用-F参数指定伪文件
svnadmin的-F选项专门用来指定读取属性值的文件路径,进程替换生成的伪文件完全符合要求:
svnadmin setrevprop -r1 MyRepoDir svn:author -F <(echo -n NewAuthor)
2. 通过输入重定向让svnadmin从stdin读取
省略属性值参数,用输入重定向把进程替换的输出导入svnadmin的标准输入:
svnadmin setrevprop -r1 MyRepoDir svn:author < <(echo -n NewAuthor)
这里的< <(...)是bash中“进程替换作为输入重定向”的写法,和直接用< 真实文件的逻辑完全一致。
额外注意点
- 确保你使用的是支持进程替换的shell(比如bash、zsh),sh等POSIX标准shell不支持这个语法;
echo -n的作用是避免输出末尾的换行符,这很重要——如果属性值带换行符,svnadmin可能会把换行符也当作属性内容的一部分,或者解析出错。
内容的提问来源于stack exchange,提问作者martin
相关产品推荐
相关产品推荐

