标签: exec

fork 和 exec 是如何工作的?

我没有太多经验,只是试图参与他们如何从用户级别解释到硬件的过程。

因此,当从 shell 触发命令时,fork()继承它exec()的子进程并将子进程加载到内存中并执行。

  1. 如果子进程包含了父进程(也就是原始进程)的所有属性,那么这个子进程需要什么?原始进程也可能已加载到内存中。
  2. 这个forkexec概念是否适用于 UNIX 中的所有可执行程序?也喜欢shell脚本还是只喜欢命令?它是否也适用于 shell 内置命令?
  3. 如果我将执行命令/脚本,何时使用复制概念?

很抱歉一次问了很多问题,但是当我想到任何命令执行时,所有这些问题都会立刻浮现在我的脑海中。

fork exec

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

将 stdout 和 stderr 复制到日志文件并将它们留在脚本本身的控制台上

使用 bash,如何将 stderr 和 stdout 复制到日志文件并将它们显示在控制台上?

我想使用 exec 在脚本本身中执行此操作。

我试过

exec &>> log.out

echo "This is stdout"
echo "This is stderr" >&2
Run Code Online (Sandbox Code Playgroud)

但是上面的内容在控制台上没有打印任何内容。我怎样才能在 bash 中实现这一点?

bash stderr exec

16
推荐指数
4
解决办法
3万
查看次数

为什么我们必须在 exec 函数中两次传递文件名?

我阅读了 Stevens 所著的Advanced Programming in the UNIX Environment8章。我阅读并理解了所有六个 exec 函数。

我注意到的一件事是,在所有 exec 函数中:

  • 第一个参数是文件名/路径名(取决于 exec 函数)。
  • 第二个参数是我们输入的 argv[0] main(),它是文件名本身。

所以在这里我们必须在函数中传递文件名两次。

有什么原因吗(比如我们无法从第一个参数的路径名中获取文件名)?

command-line exec

16
推荐指数
2
解决办法
7613
查看次数

`exec "$@"` 有什么作用?

我最近在很多docker-entrypoint.sh脚本中都看到了这一点,并且在网上找不到解释。我的第一个想法是它与信号有关,但这是一个非常疯狂的猜测。

linux bash shell-script exec

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

exec 3<&1 有什么作用?

我知道exec可以在当前 shell 上进行 I/O 重定向,但我只看到如下用法:

exec 6<&0   # Link file descriptor #6 with stdin.
            # Saves stdin.

exec 6>&1   # Link file descriptor #6 with stdout.
            # Saves stdout.
Run Code Online (Sandbox Code Playgroud)

据我了解,这<是用于输入流,>用于输出流。那么有什么作用exec 3<&1呢?

PS:我从Bats 源代码中找到了这个

shell bash io-redirection file-descriptors exec

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

bash -c "&lt;single command&gt;" 的行为是否有记录?

众所周知,当运行时bash -c "COMMAND"(至少在 Linux 的常见版本中),当有一个没有任何元字符(除了spacetabnewline)的命令时,bash -c进程不会分叉,而是将自身替换为COMMAND直接用系统调用执行execve优化,所以结果只会是一个进程。

\n
$ pid=$$; bash -c "pstree -p $pid"\nbash(5285)\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80pstree(14314)\n
Run Code Online (Sandbox Code Playgroud)\n

如果有任何元字符(例如重定向)或多个命令(无论如何都需要一个元字符),bash则会分叉它执行的每个命令。

\n
$ pid=$$; bash -c ":; pstree -p $pid"\nbash(5285)\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80bash(28769)\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80pstree(28770)\n\n$ pid=$$; bash -c "pstree -p $pid 2>/dev/null"\nbash(5285)\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80bash(14403)\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80pstree(14404)\n
Run Code Online (Sandbox Code Playgroud)\n

这是一个未记录的优化功能(这意味着它无法得到保证),还是在某处记录并得到保证?

\n
\n

注意:我认为并非所有版本的bash行为都是如此,并且在某些版本上,它只是被视为实现细节而不是保证,但我想知道是否至少有一些bash版本明确支持这一点并且记录此情况的条件。;例如,如果命令后面有一个字符,没有任何第二个命令,bash仍然execve不会分叉。

\n
$ pid=$$; bash -c "pstree -p $pid ; "\nbash(17516)\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80pstree(17658)\n
Run Code Online (Sandbox Code Playgroud)\n

我的问题的背景

\n

正如我所提到的,这种行为对于经验丰富的用户来说是众所周知的 …

bash exec

14
推荐指数
1
解决办法
1225
查看次数

Bash 内置 exec 的用例/实际示例

从 Bash 的内置 exec 文档中考虑这一点:

exec 替换 shell 而不创建新进程

请提供一个用例/实际示例。我不明白这是怎么回事。

我用谷歌搜索并找到了I/O redirection。你能解释得更好吗?

bash shell-script shell-builtin exec

13
推荐指数
2
解决办法
1991
查看次数

`exec 6&gt;&amp;1` 或类似的函数有什么作用?

我正在将一些软件从 Unix 迁移到 Linux。

我有以下脚本;它是文件传输的触发器。

命令的作用是什么exec

它们也能在 Linux 上运行吗?

#!/bin/bash
flog=/mypath/log/mylog_$8.log
pid=$$
flog_otherlog=/mypath/log/started_script_${8}_${pid}.log

exec 6>&1
exec 7>&2
exec >> $flog
exec 2>&1


exec 1>&6 
exec 2>&7

/usr/local/bin/sudo su - auser -c "/mypath/bin/started_script.sh $1 $pid $flog_otherlog $8" 
Run Code Online (Sandbox Code Playgroud)

启动的脚本如下:

#!/bin/bash
flusso=$1
pidpadre=$2
flogcurr=$3
corrid=$4
pid=$$

exec >> $flogcurr
exec 2>&1

if  [ $1 = pippo ] || [ $1 = pluto ] || [ $1 = paperino ]
    then
        fullfile=${myetlittin}/$flusso
        filename="${flusso%.*}"
        datafile=$(ls -le $fullfile  | awk '{print $6, " ", …
Run Code Online (Sandbox Code Playgroud)

linux bash exec

12
推荐指数
2
解决办法
3172
查看次数

您可以在直播时将 /tmp 分区重新挂载到 exec 吗?

我有一台服务器,我需要重新挂载 /tmp 分区才能运行 exec。

我想使用的代码是:

mount -o remount,exec /tmp
Run Code Online (Sandbox Code Playgroud)

运行需要它的程序。

不如改回来。

mount -o remount,noexec /tmp
Run Code Online (Sandbox Code Playgroud)

这是生产服务器,所以我真的很担心取消挂载 /tmp 或更改挂载。

谢谢,

mount tmp exec

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

&amp; 在“exec &amp;&gt;/dev/null”中间做什么?

我的命令是:

exec &>/dev/null
Run Code Online (Sandbox Code Playgroud)

这个 & 和完整命令在这里做什么?我知道它被重定向到位桶。

shell bash io-redirection exec

11
推荐指数
1
解决办法
6665
查看次数