【问题标题】:why shell script code in c++ don't work?为什么 c++ 中的 shell 脚本代码不起作用?
【发布时间】:2018-09-01 13:44:24
【问题描述】:

我需要知道控制台(Ubuntu)中的下一个空闲行,所以我用 C++ 编写了这段代码

using namespace std;
#define SCRIPTGETNEXTLINE "#!/bin/bash \n\
echo -en \"\\E[6n\"\n\
read -sdR CURPOS
CURPOS=${CURPOS#*[}\n\
CURPOS=$(echo $CURPOS | cut -d ';' -f 1)\n\
echo $CURPOS"

int main (){
    system(SCRIPTGETNEXTLINE);
    return 0;
}

但我得到了错误:

sh: 2: read: Illegal option -s

在脚本中这是可行的

#/bin/bash
echo -en "\E[6n"
read -sdR CURPOS
CURPOS=${CURPOS#*[}
CURPOS=$(echo $CURPOS | cut -d ';' -f 1)
echo $CURPOS

有人可以帮帮我吗?

【问题讨论】:

  • 因为 shell 脚本和 C++ 代码是两个完全不同的东西
  • 如果该脚本在名为myscript 的文件中,当您运行sh myscript 时会得到什么?
  • @zzxyz:shell 脚本和调用 shell 脚本的 C++ 程序并没有什么不同。 (虽然这绝对不是最好的方法)
  • 第一个示例中没有 read 命令。第二个示例中的 hashbang 只是一个哈希;也就是说,这不是你的真实例子。这里还有什么与现实不同的地方……?无需修改即可展示您的minimal reproducible example,这样我们就不必浪费时间猜测您实际在运行什么。
  • @LightnessRacesinOrbit - 哦..是的......很公平......我错过了第一次阅读时的 `\` 延续......

标签: c++ shell ubuntu


【解决方案1】:

bashread 命令可以理解-s 选项,但是您在sh 下运行它,而Posix shell 的read 不知道-s。请注意,在您的情况下,#! 行将被忽略,因为您将整个命令作为字符串传递。

我建议你把你的脚本写到一个文件x中,然后通过

执行这个文件
system("bash x")

然后这会将变量 CURPOS 的值显示到您的终端。

【讨论】:

    猜你喜欢
    • 2020-12-14
    • 2013-10-20
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    相关资源
    最近更新 更多