我们可以通过 /bin/sh 运行 进行哪些系统调用?

Which exactly are the system calls we can run via /bin/sh?

我是 运行 Linux Shell 命令的特定方式,我想弄清楚 运行 的两种方式是否会产生相同的结果。

示例 1:

echo "echo "hi"" | /bin/sh

hi

示例 2:

echo "pwd" | /bin/sh

/root/test

示例 3:

这里,假设有一个名为 test.txt 的文件,其中只包含单词“test”

echo "cat test.txt" | /bin/sh

test

到目前为止,一切似乎都运行良好,但是当我输入以下内容时

echo "cd .." | /bin/sh

什么都没发生,这不应该是这种情况,因为如果我键入 cd .. 而没有 | /bin/sh 并按 Enter,Shell 会带我回到之前的路径这种情况将是 /root

所以,我只想知道可通过 /bin/sh

使用的可用命令的实际列表是什么

在 运行 宁 echo "cd .." | /bin/sh 之后你会回到上一个文件夹,因为上面的命令 运行 是一个新的 shell 实例,它改变了文件夹中的当前路径新子shell,而不是调用者实例。

出于同样的原因,我们从不创建帮助脚本来更改目录,但我们在调用 shell.

的上下文中使用 运行 的别名

你可以用这种方式运行任何命令,但它们是由内部shell执行的,因此只在shell.

内有效

使用 catechopwd 在屏幕上打印文本是永久性的,即使在内部 shell 退出之后,因为实际上内部 shell 写入其标准输出,并且外部 shell(您正在使用它来键入命令)已将内部 shell 的输出链接到它自己的输出,该输出会显示在屏幕上。

“当前工作目录”的概念不是系统范围的,但它附加到一个进程,如 shell。 cd命令改变了currentshell的工作目录,但它不影响外部shell的工作目录。此外,由 shell 启动的任何新进程都将从父进程 shell 的工作目录开始,但之后在任一进程中更改目录不会对另一个产生影响。

环境变量是另一个只对当前 shell 有影响的东西,你可以选择是否通过 exporting 将环境变量传递给子进程.

例如,以下将为您提供“正确”的父目录:

echo "cd ..; pwd" | /bin/sh