Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash Clojure shell/sh无法正确处理单引号参数?_Bash_Shell_Clojure_Ffmpeg - Fatal编程技术网

Bash Clojure shell/sh无法正确处理单引号参数?

Bash Clojure shell/sh无法正确处理单引号参数?,bash,shell,clojure,ffmpeg,Bash,Shell,Clojure,Ffmpeg,在REPL中执行以下命令: (shell/sh "ls" "-lah" "'resources'") 提供以下输出: {:exit 2, :out "", :err "ls: cannot access 'resources': No such file or directory\n"} 在bashshell中执行相同的命令会得到正确的输出,即resources目录中的文件列表。据我所知,这意味着shell/sh无法正确处理单引号参数。这是真的还是我做错了什么 上面的例子是一个简单的例子,因

在REPL中执行以下命令:

(shell/sh "ls" "-lah" "'resources'")
提供以下输出:

{:exit 2, :out "", :err "ls: cannot access 'resources': No such file or directory\n"}
在bashshell中执行相同的命令会得到正确的输出,即resources目录中的文件列表。据我所知,这意味着shell/sh无法正确处理单引号参数。这是真的还是我做错了什么

上面的例子是一个简单的例子,因为通常我可能不需要单独引用文件夹名。但这是一个真正的问题,因为我试图通过使用shell/sh执行以下ffmpeg命令来压缩音频文件

ffmpeg -i resources/ffmpeg_working/1.flac
-i resources/ffmpeg_working/2.flac
-i resources/ffmpeg_working/3.flac
-i resources/ffmpeg_working/4.flac
-filter_complex '[0:0][1:0][2:0][3:0]concat=n=4:v=0:a=1[out]'
-map '[out]'
resources/ffmpeg_working/done.flac
这将提供以下输出

Stream map ''[out]'' matches no streams.

同样,如果我在bashshell中执行相同的ffmpeg命令,它会成功地连接文件。因此,单引号的参数似乎处理不正确?

引号是一种shell功能,以避免对原本解释为通配符、变量等的内容进行shell扩展。当您使用shell以外的其他工具时,例如clojure/java process management tools,没有通配符或变量,因此没有引用之类的东西。

引用是一种shell功能,以避免shell扩展本来会被解释为通配符、变量等的内容。当您使用shell以外的东西时,例如clojure/java流程管理工具,没有通配符或变量,因此没有引用之类的东西。

正如@amalloy提到的,您不应该在资源周围使用单引号。有无比较:

(require '[clojure.java.shell :as shell])
;=> nil
(shell/sh "ls" "-lah" "'resources'")
;=> {:exit 2, :out "", :err "ls: cannot access 'resources': No such file or directory\n"}
(shell/sh "ls" "-lah" "resources")
;=> {:exit 0, :out "total 8.0K\ndrwxrwxr-x 2 alan alan 4.0K Nov  4  2015 .\ndrwxrwxr-x 8 alan alan 4.0K Jul 14 10:25 ..\n", :err ""}
请注意,您根本没有运行任何shell;您直接与unix内核对话,因此不会进行通配符扩展。例如,以下命令查找名为*star的文件,没有shell将*字符解释为表示任何匹配文件的代码:

(shell/sh "ls" "-l" "*")
;=> {:exit 2, :out "", :err "ls: cannot access *: No such file or directory\n"}
如果您希望在将命令传递到Linux内核之前由shell解释,您可能希望使用shell cmd函数:


请注意,shell cmd只接受直接传递给shell的单个字符串参数,而不接受clojure.java.shell/sh等多个参数。

正如@amalloy所提到的,您不应该在资源周围使用单引号。有无比较:

(require '[clojure.java.shell :as shell])
;=> nil
(shell/sh "ls" "-lah" "'resources'")
;=> {:exit 2, :out "", :err "ls: cannot access 'resources': No such file or directory\n"}
(shell/sh "ls" "-lah" "resources")
;=> {:exit 0, :out "total 8.0K\ndrwxrwxr-x 2 alan alan 4.0K Nov  4  2015 .\ndrwxrwxr-x 8 alan alan 4.0K Jul 14 10:25 ..\n", :err ""}
请注意,您根本没有运行任何shell;您直接与unix内核对话,因此不会进行通配符扩展。例如,以下命令查找名为*star的文件,没有shell将*字符解释为表示任何匹配文件的代码:

(shell/sh "ls" "-l" "*")
;=> {:exit 2, :out "", :err "ls: cannot access *: No such file or directory\n"}
如果您希望在将命令传递到Linux内核之前由shell解释,您可能希望使用shell cmd函数:


请注意,shell cmd只接受直接传递给shell的单个字符串参数,而不接受clojure.java.shell/sh等多个参数。

如果需要shell功能,可以直接调用shell。Bash支持-c在普通Bash上下文中运行某些命令。当您需要从~/.profile或~/.bashrc进行设置时,这非常有用

您现在可以使用任何shell功能。管道示例:

(bash "find . | grep .clj")
;; => {:exit 0, :out "./src/user.clj\n", :err ""}
您的shell只是一个可以启动其他应用程序的应用程序。您可以告诉shell启动应用程序。当您使用clojure.java.shell/sh启动应用程序时,您并不是在bash之上,而是以与bash启动应用程序相同的方式启动应用程序

不通过bash间接实现的优势:

你对输入有更好的控制。如果要将输入传递给bash,则很难转义输入。 您有意不依赖shell的配置。这些信息通常因系统而异,可能会导致生产中出现问题。
如果需要shell功能,可以直接调用shell。Bash支持-c在普通Bash上下文中运行某些命令。当您需要从~/.profile或~/.bashrc进行设置时,这非常有用

您现在可以使用任何shell功能。管道示例:

(bash "find . | grep .clj")
;; => {:exit 0, :out "./src/user.clj\n", :err ""}
您的shell只是一个可以启动其他应用程序的应用程序。您可以告诉shell启动应用程序。当您使用clojure.java.shell/sh启动应用程序时,您并不是在bash之上,而是以与bash启动应用程序相同的方式启动应用程序

不通过bash间接实现的优势:

你对输入有更好的控制。如果要将输入传递给bash,则很难转义输入。 您有意不依赖shell的配置。这些信息通常因系统而异,可能会导致生产中出现问题。
谢谢你的回答!那么,这是否意味着完全不可能执行需要单引号参数的shell命令?您完全误解了答案。您根本不是在执行shell命令,而是在运行一个程序,就好像是通过。你不能引用任何东西,因为没有必要引用任何东西
需要在整个过滤器段周围安装uotes。这就是为什么我要引用它们。事实上,你说得很对。在Clojure中执行ffmpeg命令时,我删除了所有单引号,它工作正常。永远不需要引用任何东西:谢谢你的回答!那么,这是否意味着完全不可能执行需要单引号参数的shell命令?您完全误解了答案。您根本不是在执行shell命令,而是在运行一个程序,就好像是通过。您不能引用任何内容,因为不需要引用任何内容。根据本页,需要在整个筛选部分使用单引号。这就是为什么我要引用它们。事实上,你说得很对。在Clojure中执行ffmpeg命令时,我删除了所有单引号,它工作正常。无需引用任何内容,永远: