lin*_*usg 6 python shell command-line cross-platform separator
对于新功能PyInstaller,我们需要一个命令行选项,接收包含任何分隔符的字符串.以下是讨论:https://github.com/pyinstaller/pyinstaller/pull/1990.
例:
pyinstaller --add-data="file.txt?dir"
Run Code Online (Sandbox Code Playgroud)
?这里是分隔符,这应该是另一个字符.不保证,字符串被引用!
我们已经考虑过; : > < | *等等,但我们无法弄清楚要使用哪个角色,没有副作用和平台独立(并且希望在路径中不允许).>例如,将重定向stdout,;是POSIX等命令分隔符.
任何想法我们可以使用什么角色?
你的问题在某种程度上是XY问题的一个例子。至少是一条红鲱鱼。
\n\n如下所示,不存在理想的路径分隔符,因此,如果您确实坚持支持任意疯狂的路径,则必须在单独的命令行选项中传递该信息。那么,在调用您的程序时,由用户来转义路径中的奇怪字符。
\n\nUnix 路径可以包含除 ASCII NUL ( ) 之外的任何字符\\0。路径组成部分(文件名)不允许包含斜杠 ( /)。根据 POSIX 的说法,其他任何事情都可以。
因此,您选择了太严格的约束。即使在 Unix 上也不存在解决您的问题的理想解决方案,完全忽略可移植性问题。
\n\n您必须在路径上放置一些 \xe2\x80\x9ccommon sense\xe2\x80\x9d 约束,例如,它们在 Windows 上不包含分号,在 Unix 上不包含冒号。顺便说一句,这种组合非常自然、直观且易于阅读,因为这些字符是这些系统的路径分隔符。
\n\n让\xe2\x80\x99s 查找是否可以只保留一个可能永远不会出现在路径中的字符。那么这组约束可以满足吗?
\n\n如果您列出非字母数字的可打印 ASCII 字符并删除那些对 Unix shell 有特殊含义的字符以及即使是理智的人也在路径中使用的字符(_、- 等),您可以选择一个合理的路径分隔符:
\n\nLC_ALL=C\nawk \'BEGIN{ for (i=1;i<ARGC;i++) printf "%c\\n", ARGV[i]; }\' {1..127} |\n grep \'^[[:print:]]$\' |\n grep \'^[^][*?~$`"\'\\\'\'&|#\\<>(){}!;/[:alnum:] ._-]$\'\nRun Code Online (Sandbox Code Playgroud)\n\nASCII 为 0..127,但排除 0,因为它会导致面向文本的实用程序出现问题。Bash 特价商品也被过滤掉。
\n\n不过,结果集仅包含七个字符:%+,:=@^
不幸的是,百分号 ( %) 和插入符号 ( )在 Windows 路径中和冒号 ( )^中具有特殊含义。仅剩四个:cmd.exe:+,=@
要么你选择其中之一,要么你认为它们不方便,然后你修改特殊列表来为不同的系统选择不同的字符(例如你建议的冒号和分号折衷方案),这稍微放松了可移植性限制。或者波浪号 ( ~) 在 shell 中可能并不特殊,因为它仅在 shell 单词开始时扩展到主目录路径。或者您可能不需要分隔符,但您可以猜测很少有文件的@@@名称中包含分隔符字符串 \xe2\x80\x93 。