Linux命令不明确重定向

Linux命令不明确重定向,linux,bash,Linux,Bash,嗨,我有一个名为header.txt的实验室头文件,我想输入我的3C文件 cat../header.txt>find-name*.c 上面的语句有什么问题?输出重定向用于文件,而不是命令。您需要分别处理每个文件 find -name *.c -print0 | while IFS= read -r -d '' f; do cat ../header.txt >> $f # Append instead of overwriting done 至于“模棱两可的重定向”,您通常

嗨,我有一个名为header.txt的实验室头文件,我想输入我的3C文件
cat../header.txt>find-name*.c


上面的语句有什么问题?

输出重定向用于文件,而不是命令。您需要分别处理每个文件

find -name *.c -print0 | while IFS= read -r -d '' f; do
  cat ../header.txt >> $f   # Append instead of overwriting
done
至于“模棱两可的重定向”,您通常会在编写以下内容时得到:

... > *.c
glob
*.c
将扩展到多个文件。例如:

$ echo "" >> *.c
-sh: *.c: ambiguous redirect
$

输出重定向用于文件,而不是命令。您需要分别处理每个文件

find -name *.c -print0 | while IFS= read -r -d '' f; do
  cat ../header.txt >> $f   # Append instead of overwriting
done
至于“模棱两可的重定向”,您通常会在编写以下内容时得到:

... > *.c
glob
*.c
将扩展到多个文件。例如:

$ echo "" >> *.c
-sh: *.c: ambiguous redirect
$

您可以使用以下命令在C文件前面加上lab头:

for file in *.c
do cat ../header.txt "$file" > x
   mv x "$file"
done

如果这是一个生产操作,您可能会担心使用一个唯一的文件名作为临时文件(我只是假设,如果您太粗心,有一个名为
x
的文件,它不包含任何重要内容),您会处理中断等问题,并清理中间文件。您可以考虑是否最好使用
mv
cp
替换原始文件-再次考虑权限、符号链接、硬链接和清理。

您可以使用以下命令在C文件前面加上lab头:

for file in *.c
do cat ../header.txt "$file" > x
   mv x "$file"
done

如果这是一个生产操作,您可能会担心使用一个唯一的文件名作为临时文件(我只是假设,如果您太粗心,有一个名为
x
的文件,它不包含任何重要内容),您会处理中断等问题,并清理中间文件。您可以考虑是否最好使用
mv
cp
替换原始文件-再次考虑权限、符号链接、硬链接和清理。

I/O重定向操作符
等。所有操作都只使用一个单词作为参数,并将其用作文件名。其他任何内容都被视为命令行的一部分

所以当你运行这个:

cat ../header.txt > find -name *.c
与此完全相同:

cat ../header.txt -name *.c > find
那可能不会有什么用处

另一个问题是:您的
*.c
没有转义或引用,因此bash将对其进行扩展,而不是将其传递给
find


您可以使用
tee
,它可以接受任意数量的参数:

cat ../header.txt | tee *.c
然后你甚至不再需要猫了,真的

tee *.c < ../header.txt

但实际上,您必须单独列出每个文件,因此您不能将此快捷方式与glob一起使用,例如
*.c

I/O重定向操作符
,等等。所有操作都只使用一个单词作为参数,并将其用作文件名。其他任何内容都被视为命令行的一部分

所以当你运行这个:

cat ../header.txt > find -name *.c
与此完全相同:

cat ../header.txt -name *.c > find
那可能不会有什么用处

另一个问题是:您的
*.c
没有转义或引用,因此bash将对其进行扩展,而不是将其传递给
find


您可以使用
tee
,它可以接受任意数量的参数:

cat ../header.txt | tee *.c
然后你甚至不再需要猫了,真的

tee *.c < ../header.txt

但实际上,您必须单独列出每个文件,因此不能将此快捷方式与glob一起使用,例如
*.c

try:for i in*.c;do cat../header.txt>$i;完成;我去编辑了这个问题,但我无法确定您的实际命令行是什么。在“3 C文件”后插入一个空行,然后将命令文本缩进4个空格,并删除结尾的反引号(并插入实际命令中出现的任何反引号)。尝试:在*.C中输入i;do cat../header.txt>$i;完成;我去编辑了这个问题,但我无法确定您的实际命令行是什么。在“3个C文件”后插入一个空行,然后将命令文本缩进4个空格,并删除结尾反引号(并插入实际命令中出现的任何内容)。