假设我想编写一个需要接受略微结构化数据的工具,使用json作为命令行参数是否合理,而在环境中使用它是否合理?
例如
fudge_files "['file1', 'file2']" # here list of files could be used
fudge_files --dirs "['dir1', 'dir2']" pattern.* another*.foo
或者是一个更复杂的例子
fudge_files --dst "{'txt': ['/foo', '/bar'], 'pdf': ['/foo']}" pattern.*
这是一个好主意还是坏主意?
有哪些陷阱?
答案 0 :(得分:1)
大多数(所有)shell将看到单引号和dbl引号,并按照标准过程处理它们。
为了保留引号以便它们作为数据传入,你需要转义它们,即
\"[\'file1\', \'file2\']\"
一旦你的数据开始包含合法的“\”字符,它就会变得非常难看。你可以拿出黑客攻击,但这会很痛苦,而且你可以花费很多的时间来尝试与这种引用相关的调试问题。
并且,如果你坚持,并使其工作,那么,2-3个月之后,你可能会认为“我可以将其中的一部分放在变量中并使用eval
”或其他疯狂来将变量扩展为一个字符串。现在你真的在调试噩梦。
另外,我使用shell ANSI字符串进行快速测试,看看是否有帮助,但是
$ var=$'"['file1', 'file2']"'
$ echo $var
"[file1, file2]"
$ echo "$var"
"[file1, file2]"
$ var=$""['file1', 'file2']""
-ksh: file2]: not found [No such file or directory]
ANSI字符串是定义为$'My Static ANSI String'
或$"myANSIString with $var input"
的字符串
请注意,即使在第一个示例中,shell在第一次机会时匹配单引号,并将它们从输入字符串中删除。希望它是剥离它们的echo
,我在第2 echo
行使用了最佳实践,并在引号中包围了"$var"
。不,单引号已经消失。 : - (
我没有那么多使用ANSI字符串的经验,所以其他人可能会提供一个解决方案来保持单引号和dbl引号完整。
否则,我认为这不起作用。
你的工作流程不是很清楚,但猜测某些东西正在发出这些值(我希望你不必输入它们),我认为你把它们放到文件中要好得多。如果单独的程序将它们打印到终端,则只需重定向到文件
json_emitting_program --args .... > $tmpFile
或者使用Unix工具来消除tmp文件,管道|
,并编写工具从std-in读取数据,而不是作为命令行参数。
然后你会说
json_emitting_program --args .... | fudge_files
OR,使用tmp文件
fudge_files < "$tmpFile"
如果您的数据源位于MS Windows输出中(例如),您可以使用Unix here-documents
在文件上创建临时文件,类似
cat - > $tmpFile << EOS
paste your input here
and here
etc
EOS
请注意,EOS必须在它自己的一行上,没有尾随的空格。
如果正确完成,shell应该向您返回提示。
确认该文件在那里并且是最新的
ls -l $tmpFile
和上面一样,运行你的程序
fudge_files < "$tmpFile"
如果您不知道,可以创建tmpFile,只需对您想要命名的任何路径/文件进行简单分配:
tmpFile=/path/to/myTempFile
IHTH