Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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脚本中将${projSRC}输出到文件_Bash_Shell_File - Fatal编程技术网

在Bash脚本中将${projSRC}输出到文件

在Bash脚本中将${projSRC}输出到文件,bash,shell,file,Bash,Shell,File,我正在编写一个Bash脚本,为项目创建一个CMakeLists.txt文件。 问题出现在这一部分: echo "file(GLOB projSRC src/*.cpp)" >> CMakeLists.txt 之后,我需要程序将${SOURCES}输出到CMakeLists.txt 我不是说脚本中名为SOURCES的变量,我是说它实际上应该编写纯文本${SOURCES} 我的意思是,最终文件应该是这样的: arbitrary_command(target PROJECT so

我正在编写一个Bash脚本,为项目创建一个CMakeLists.txt文件。
问题出现在这一部分:

    echo "file(GLOB projSRC src/*.cpp)" >> CMakeLists.txt
之后,我需要程序将
${SOURCES}
输出到CMakeLists.txt
我不是说脚本中名为SOURCES的变量,我是说它实际上应该编写纯文本
${SOURCES}

我的意思是,最终文件应该是这样的:

arbitrary_command(target PROJECT sources ${SOURCES})  
而不是像:

arbitrary_command(target PROJECT sources [insert however bash messes it up here])

如何在Bash脚本中执行此操作?

可能是我不理解您的问题

但是

将打印

${SOURCES} 

给你。

可能是我不明白你的问题

但是

将打印

${SOURCES} 

适合您。

对文字字符串使用单引号,而不是双引号:

echo 'file(GLOB ${projSRC} src/*.cpp)' >> CMakeLists.txt

这样说,在这种情况下,您可以考虑使用一个遗传算法(甚至是一个引用的遗传算法),将整个文件写入一个命令:

cat >CMakeLists.txt <<'EOF'
everything here will be emitted to the file exactly as written
${projSRC}, etc
even over multiple lines
EOF

您还可以使用多个命令将输出写入单个重定向,以避免支付多次打开输出文件的费用:

foo=this
{
  echo "Here's a line, which is expanded due to double quotes: ${foo}"
  echo 'Here is another line, with no expansion due to single quotes: ${foo}'
} >CMakeLists.txt

对文字字符串使用单引号,而不是双引号:

echo 'file(GLOB ${projSRC} src/*.cpp)' >> CMakeLists.txt

这样说,在这种情况下,您可以考虑使用一个遗传算法(甚至是一个引用的遗传算法),将整个文件写入一个命令:

cat >CMakeLists.txt <<'EOF'
everything here will be emitted to the file exactly as written
${projSRC}, etc
even over multiple lines
EOF

您还可以使用多个命令将输出写入单个重定向,以避免支付多次打开输出文件的费用:

foo=this
{
  echo "Here's a line, which is expanded due to double quotes: ${foo}"
  echo 'Here is another line, with no expansion due to single quotes: ${foo}'
} >CMakeLists.txt

就这么简单!?bare命令适用于这种特定情况,但良好的做法仍然是使用引号——如果没有引号,则会得到全局扩展(除非为引号),字符串拆分会将空格更改为不同的类型(即将制表符更改为空格,或将多个空格更改为一个空格,或删除前导空格或尾随空格),等等…这对于像makefile这样的文件格式尤其重要,因为空白类型很重要。我部分同意。。。使用单引号的解决方案同样有效,在某些情况下可能更好。对我来说,我一开始考虑的是转义\的解决方案,因为有时我需要在同一行有一些变量和一些$not_a_变量文本。就这么简单!?bare命令适用于这种特定情况,但良好的做法仍然是使用引号——如果没有引号,则会得到全局扩展(除非为引号),字符串拆分会将空格更改为不同的类型(即将制表符更改为空格,或将多个空格更改为一个空格,或删除前导空格或尾随空格),等等…这对于像makefile这样的文件格式尤其重要,因为空白类型很重要。我部分同意。。。使用单引号的解决方案同样有效,在某些情况下可能更好。对我来说,我一开始考虑的是转义\的解决方案,因为有时我需要在同一行中包含一些变量和一些$not_a_variable text。顺便说一句,反复使用
>outputFile
并不是一种好的形式——每次你把它放在命令上时,shell都会在运行那一行之前打开输出文件进行追加,然后再次关闭输出文件。为整个块重定向stdout要有效得多:
{echo“hello”;echo“world”}>outputFile
顺便说一句,反复使用
>outputFile
并不是一种好的形式——每次你把它放在一个命令上,shell在运行那一行之前打开输出文件进行追加,然后再次关闭输出文件。为整个块重定向stdout要高效得多:
{echo“hello”;echo“world”}>outputFile