小编Moh*_*mad的帖子

STDIN 和传递给 command 的参数有什么区别?

我可以使用任一形式来执行该cat方法:

cat file_name
cat < file_name
Run Code Online (Sandbox Code Playgroud)

结果是一样的

然后我想以man格式执行stdin

man < file_name
Run Code Online (Sandbox Code Playgroud)

虽然file_name包含:

# file_name
cat
Run Code Online (Sandbox Code Playgroud)

但它弹出 What manual page do you want?而不是 execute man cat

我想知道为什么cat可以接受stdin作为参数但man不能。命令行参数和stdin?之间有什么区别?

pipe io-redirection arguments

23
推荐指数
2
解决办法
3万
查看次数

为什么echo和cat的执行时间有这么大的差别?

回答这个问题让我提出了另一个问题:
我认为下面的脚本做同样的事情,第二个应该快得多,因为第一个使用cat需要一遍又一遍地打开文件但第二个只打开文件一次,然后只回显一个变量:

(有关正确的代码,请参阅更新部分。)

第一的:

#!/bin/sh
for j in seq 10; do
  cat input
done >> output
Run Code Online (Sandbox Code Playgroud)

第二:

#!/bin/sh
i=`cat input`
for j in seq 10; do
  echo $i
done >> output
Run Code Online (Sandbox Code Playgroud)

而输入大约是 50 兆字节。

但是当我尝试第二个时,它太慢了,因为回显变量i是一个巨大的过程。我也遇到了第二个脚本的一些问题,例如输出文件的大小低于预期。

我还检查了手册页echocat比较了它们:

echo - 显示一行文本

cat - 连接文件并在标准输出上打印

但我没有得到区别。

所以:

  • 为什么在第二个脚本中 cat 如此之快而 echo 如此之慢?
  • 还是变量的问题i?(因为在它的手册页中 echo说它显示“一行文本”,所以我猜它只针对短变量进行了优化,而不是像 那样非常长的变量i。然而,这只是一个猜测。)
  • 为什么我在使用时遇到问题echo

更新

我用seq 10而不是`seq 10`错误的。这是编辑后的代码: …

shell echo quoting cat command-substitution

15
推荐指数
2
解决办法
6408
查看次数

如何将 splitfile[az] 重命名为 splitfile[1-26]

我正在尝试重命名以splitfile[a-z]to形式命名的文件splitfile[1-26].csv,即我想重命名splitfileasplitfile1.csv等等。
我尝试了以下命令:

mv splitfile[a-z] splitfile[1-26].csv 
Run Code Online (Sandbox Code Playgroud)

但它不起作用。请帮助我,同时我正在尝试使用 for 循环。

rename command mv

7
推荐指数
2
解决办法
705
查看次数

为什么在 shell 脚本(使用 pdftk)中注释掉这一行会导致问题?

考虑以下简单的 shell 脚本(使用pdftk):

#!/bin/sh    
echo "" | ps2pdf -sPAPERSIZE=a4 - blank.pdf

pdftk \
    A=blank.pdf \
    B=blank.pdf \
    C=blank.pdf \
    cat A C \
    output foo.pdf
Run Code Online (Sandbox Code Playgroud)

现在,如果我注释掉一行,就会出现古怪。这是修改后的脚本。

#!/bin/sh

echo "" | ps2pdf -sPAPERSIZE=a4 - blank.pdf

pdftk \
    A=blank.pdf \
#   B=blank.pdf \
    C=blank.pdf \
    cat A C \
    output foo.pdf
Run Code Online (Sandbox Code Playgroud)

输出看起来像:

Done.  Input errors, so no output created.
cat: A: No such file or directory
cat: C: No such file or directory
cat: output: No such file or directory …
Run Code Online (Sandbox Code Playgroud)

shell-script

5
推荐指数
1
解决办法
513
查看次数

如何在shell脚本中将数据附加到缓冲区?

我想使用 shell 脚本执行以下操作:(为简单起见,我对 INPUT 使用相同的数据。在实际情况下,数据随循环标签 jj 发生变化)

#!/bin/sh
for jj in `seq 100`; do
    cat INPUT.file >> OUTPUT.file
done
Run Code Online (Sandbox Code Playgroud)

然而,这是非常低效的,因为打开和关闭文件都在循环中。当 INPUT.file 的大小很大时,这段代码会很慢。所以我想知道是否有办法拥有/创建一个缓冲区,比如在 C 中创建一个预先分配的变量。

shell buffer cat

4
推荐指数
1
解决办法
1704
查看次数

更好的覆盖方式?

我们目前正在做经典的planA。

我想知道哪个更好?

无论fileAfileB生存,以50〜100〜大小。

假设在 Linux/mac 中的同一个 NFS 挂载中

假设这是两个文件都存在的覆盖

# planA - we do this way
mv /pathA/fileA /pathB/fileB

# planB
rm /pathB/fileB; mv /pathA/fileB /pathB/fileB

# planB1 - I think is the same as planB, but not sure
unlink /pathB/fileB; ln /pathA/fileA /pathB/fileB
Run Code Online (Sandbox Code Playgroud)

files

2
推荐指数
1
解决办法
488
查看次数