有文件A、B、C。我想连接文件A、B和C(跳过C的第一行)。然后将它们作为输入发送到 myProgram。我怎样才能在shell脚本中写这个?
我写的是
cat A > file
echo >> file //want to start all contents in new line
cat B >> file
tail -n+2 C >> file
./myProgram < file
但我不知道如何连接它们并发送到程序而不生成文件
答案1
尝试这个 :
{ cat A ; echo; cat B ; awk 'NR>1' C ; } | programm
将命令放入其中大括号是分组。
;
如果没有换行符来完成,则不是强制性的分组。
不需要另一个子外壳这里 ;)
答案2
使用进程替换
./myProgram < <(cat A; echo ''; cat B; tail -n +2 C)
<(commands)
创建一个 fifo 文件,然后将其读入程序
你可以通过做测试
$ echo <(cat A; echo ''; cat B; tail -n +2 C) /dev/fd/63
支持命名管道 (FIFO) 或 /dev/fd 命名打开文件方法的系统支持进程替换。它采用<(列表)或>(列表)的形式。进程列表的输入或输出连接到 FIFO 或 /dev/fd 中的某个文件。该文件的名称作为扩展结果作为参数传递给当前命令。如果使用 >(list) 形式,写入文件将为列表提供输入。如果使用 <(list) 形式,则应读取作为参数传递的文件以获得 list 的输出。如果可用,进程替换与参数和变量扩展、命令替换和算术扩展同时执行。
答案3
使用子外壳。在子 shell 中运行命令并将输出通过管道传输到您的程序。
(cat a; echo; cat b; tail -n+2 c) | ./myProgram
答案4
awk方法
awk 'ARGIND<3;ARGIND==3&&FNR>1' a b c | ./myProgram