关于 shell 脚本和管道行为的澄清

Man*_*noj 4 linux shell-script

我需要了解以下 shell 脚本的行为。

#!/bin/bash
echo "First more"
more $1

echo "First echo"
echo $1

echo "Second more"
more $1
Run Code Online (Sandbox Code Playgroud)

当我运行以下命令时:

echo dir1 | bash script.sh
Run Code Online (Sandbox Code Playgroud)

我得到以下输出

First more
dir1
First echo

Second more
Run Code Online (Sandbox Code Playgroud)

为什么echo第二个more无法访问 的内容$1

当我运行以下命令时:

echo dir1 | bash script.sh dir2
Run Code Online (Sandbox Code Playgroud)

我得到以下命令

First more

dir1

*** dir2: directory ***

First echo
dir2
Second more

*** dir2: directory ***
Run Code Online (Sandbox Code Playgroud)

dir2被传递给所有命令,但更多只是打印dir1但被认为dir2是一个目录。

Mat*_*Mat 7

你混淆了参数和标准输入。将数据传送到程序并不等同于为其提供命令行参数。

在您的第一种情况下,您没有向脚本传递任何参数,仅通过其标准输入流为其提供数据。所以$1在脚本的整个持续时间内都没有设置。
因此的第一次调用more没有参数,并分页标准输入。这将显示您在其中输入的内容 ( dir1, 作为文本)。后续echo只打印一个新行,因为它没有打印任何东西,最后一个more也没有什么可打印的 - 标准输入已被第一个“耗尽”。

在第二种情况下,您确实传递了一个参数。所以$1有值dir2的脚本。同样的事情发生了,除了第一个more

  • 通过两个标准输入页面
  • 尝试对文件dir2和错误进行分页,因为那是一个目录

回声做了预期的事情,因为它$1包含dir2,并且最后一个more唯一的错误是dir2- 它没有从标准输入中读取任何内容。