【问题标题】:Squirrel script - whitespace problem - add a "space" to pass to "echo" command松鼠脚本 - 空格问题 - 添加“空格”以传递给“回声”命令
【发布时间】:2019-01-08 13:05:40
【问题描述】:

我有一个调用“回声”的松鼠插件。这几乎是正确的,但是尽管考虑了关于如何处理“空白”或元字符问题的 stackoverflow 上的各种响应(以及其他与 unix 相关的站点),但我无法获得“回声”工作。

松鼠插件如下:

fe.add_transition_callback( "removefavourite" );
function removefavourite( ttype, var, ttime )
{
switch ( ttype )
{
case Transition.ChangedTag:
            fe.plugin_command( "/bin/echo", "\"" + fe.game_info( Info.Name ) + "\"" + " > " + "\"" + "/home/pi/.attract/romlists/REMOVEFAVOURITE.temp\"");
    return false;
}}

我收到的错误如下:

The parameter word expansion failed. ["Sam's Journey (Easyflash)" > "/home/pi/attract/romlists/REMOVEFAVOURITE.temp"].

代码有效地将输出传递到终端。但是,它不会将输出重定向到 REMOVEFAVOURITE.temp 文件。问题似乎是围绕“>”或“>”本身的空白。

我已经尝试了几十种“ > ”的替代品,但没有一个奏效。如何创建一个“空间”来传递给它可以接受的脚本?谢谢。

【问题讨论】:

  • 你在哪里调用bash/bin/echo 不是bash,它是一个单独的程序(bash 有自己的内置函数echo)。
  • 当然> 是一个shell 元字符,但您似乎没有在任何地方运行shell。您是否尝试过使用/bin/bash -c echo .....
  • 谢谢。我是新手。我已经更改了问题,删除了对 bash 的引用。我还没有尝试过 /bin/bash 命令。老实说,我发现 squirrel 脚本很难在不出现错误的情况下进行更改。在保留 /bin/echo 命令的同时,我可以对代码进行一些其他更改吗?
  • (抱歉耽搁了,我们可能在不同的时区)。问题是您需要重定向功能>,这是bash 和其他shell 使用的功能,它不是echo 的功能。所有echo 都会写入标准输出流。我对squirrel 一无所知,因此无法就此提供建议,但我真的会尝试使用/bin/bash -c echo... 而不是/bin/echo
  • 谢谢。这肯定是时区问题。我用“/bin/bash -c echo”替换了“/bin/echo”,但还是出现了单词扩展错误。当我从命令行使用“/bin/bash -c echo”时,它确实创建了 REMOVEFAVOURITE.temp 文件,但没有内容。但是,如果我只使用“echo”代替它,它将创建包含内容的文件。

标签: bash echo whitespace space squirrel


【解决方案1】:

我设法解决了我遇到的这个问题。我发现“保持简单、愚蠢”,让插件处理一个参数是可行的方法。

我对插件做了如下修改:

fe.add_transition_callback( "removefavourite" );
function removefavourite( ttype, var, ttime )
{
switch ( ttype )
{
case Transition.ChangedTag:
fe.plugin_command( "/usr/bin/printf1.sh", "\"" + fe.game_info(Info.Name) + "\"" );
system( "sudo /bin/bash /opt/retropie/configs/all/removefavourite.sh" ); // Starts the process of removing the game from Favourites.txt
}
return false;
}
fe.add_transition_callback( "removefavourite" )

此插件将游戏名称发送到我创建的名为“printf1.sh”的新 bash 脚本中。 bash 脚本与“/usr/bin/”文件夹中的“printf”命令位于同一文件夹中。 bash 脚本必须进入该文件夹,否则会出现“chdir”(更改目录)错误。

bash 脚本的内容是:

#!/bin/bash 
FILE1=$1 
sudo /usr/bin/printf "$FILE1" > "/home/pi/.attract/romlists/REMOVEFAVOURITE.temp"

基本上,游戏名称是“参数”,它从 squirrel 插件发送到 bash 脚本,然后将游戏名称(输出)重定向到文件“REMOVEFAVOURITE.temp”。

这种方法的好处是,无论游戏名称采用什么形式,例如使用单个撇号或 () 或 [],例如“Sam's Journey (c64)”或“Sam's Journey [c64]”,脚本都会捕获它并传递它。特殊字符没有区别。

从那里,我可以用“REMOVEFAVOURITE.temp”中记录的信息做任何我喜欢的事情。

【讨论】:

    猜你喜欢
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多