【问题标题】:Pipe fswatch output into a shell script将 fswatch 输出通过管道传输到 shell 脚本中
【发布时间】:2017-01-15 11:55:04
【问题描述】:

我正在尝试使用以下技术将 fswatch 的输出通过管道传输到 shell 脚本中的多个命令:

$ fswatch -0 [opts] [paths] | xargs -0 -n 1 -I {} [command]

而不是 [command] 我把 shell 脚本路径。这是我的命令行:

fswatch -0 -Ie ".*\.*$" -i ".*\.mp4$" ~/Desktop/encoding\ tests | xargs -0 -n 1 -I {} ~/Desktop/s3cmd.sh

脚本如下:

#!/bin/sh 
terminal-notifier -message "s3cmd Upload {}" ; 
s3cmd sync --acl-public -m video/mp4 --add-header=Cache-Control:public,max-age=2052000 {} s3://saltanat-test/ && 
terminal-notifier -message "s3cmd Upload of {} done"

对不起,我对 shell 脚本没有经验。 如何将 fswatch 输出通过管道传输到脚本中?

谢谢。

【问题讨论】:

  • {} 将无法在 shell 脚本中识别,但您可以将它们替换为 ${@} 或更窄的 $1。我已经有一段时间没有理由使用它了,但它应该可以工作。祝你好运。
  • 不幸的是它不起作用。既不是${@} 也不是$1。但是谢谢你的回答。我在想也许读取命令可以提供帮助:read {}。但也没有成功。
  • 所以我的意思是 #!/bin/sh ; terminal-notifier -message "s3cmd Upload ${@}" ; ...${@} ...; .... ${@}... etc...terminal-notifier -message "s3cmd Upload ${1}"; ... etc 。祝你好运。
  • 是的,我是这样尝试的,但是我没有成功,对不起。
  • 我会尝试fswatch .... | xargs ..... echo {} 看看xargs 正在处理什么。也许这会给你一个线索。抱歉,我无法访问 fswatch 系统,所以我不能更具体。祝你好运。

标签: bash shell piping s3cmd fswatch


【解决方案1】:
#!/bin/bash
fswatch -0 -x --event Created --event Updated --event Renamed -Ie '.*\.*$' -i '.*\.mp4$' ~/Desktop/encoding\ tests \
     | xargs -0 -n 1 ~/Desktop/s3cmd-3.sh

这行得通。谢谢。

【讨论】:

    【解决方案2】:

    对于将来有这个问题的任何人:

    fswatch 命令:

    fswatch -0 /path/to/watch | xargs -0 -n 1 -I {} ~/yourfile.sh {}
    

    .sh 文件:

    #!/bin/bash
    echo $1
    

    现在 $1 将等于 fswatch 的输出,即被更改文件的完整路径。

    【讨论】: