我没有太多经验,只是试图参与他们如何从用户级别解释到硬件的过程。
因此,当从 shell 触发命令时,fork()继承它exec()的子进程并将子进程加载到内存中并执行。
fork和exec概念是否适用于 UNIX 中的所有可执行程序?也喜欢shell脚本还是只喜欢命令?它是否也适用于 shell 内置命令?很抱歉一次问了很多问题,但是当我想到任何命令执行时,所有这些问题都会立刻浮现在我的脑海中。
使用 bash,如何将 stderr 和 stdout 复制到日志文件并将它们显示在控制台上?
我想使用 exec 在脚本本身中执行此操作。
我试过
exec &>> log.out
echo "This is stdout"
echo "This is stderr" >&2
Run Code Online (Sandbox Code Playgroud)
但是上面的内容在控制台上没有打印任何内容。我怎样才能在 bash 中实现这一点?
我阅读了 Stevens 所著的Advanced Programming in the UNIX Environment,第8章。我阅读并理解了所有六个 exec 函数。
我注意到的一件事是,在所有 exec 函数中:
main(),它是文件名本身。所以在这里我们必须在函数中传递文件名两次。
有什么原因吗(比如我们无法从第一个参数的路径名中获取文件名)?
我最近在很多docker-entrypoint.sh脚本中都看到了这一点,并且在网上找不到解释。我的第一个想法是它与信号有关,但这是一个非常疯狂的猜测。
我知道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 源代码中找到了这个
众所周知,当运行时bash -c "COMMAND"(至少在 Linux 的常见版本中),当有一个没有任何元字符(除了space、tab或newline)的命令时,bash -c进程不会分叉,而是将自身替换为COMMAND直接用系统调用执行execve优化,所以结果只会是一个进程。
$ pid=$$; bash -c "pstree -p $pid"\nbash(5285)\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80pstree(14314)\nRun Code Online (Sandbox Code Playgroud)\n如果有任何元字符(例如重定向)或多个命令(无论如何都需要一个元字符),bash则会分叉它执行的每个命令。
$ 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)\nRun Code Online (Sandbox Code Playgroud)\n这是一个未记录的优化功能(这意味着它无法得到保证),还是在某处记录并得到保证?
\n注意:我认为并非所有版本的bash行为都是如此,并且在某些版本上,它只是被视为实现细节而不是保证,但我想知道是否至少有一些bash版本明确支持这一点并且记录此情况的条件。;例如,如果命令后面有一个字符,没有任何第二个命令,bash仍然execve不会分叉。
$ pid=$$; bash -c "pstree -p $pid ; "\nbash(17516)\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80pstree(17658)\nRun Code Online (Sandbox Code Playgroud)\n正如我所提到的,这种行为对于经验丰富的用户来说是众所周知的 …
从 Bash 的内置 exec 文档中考虑这一点:
exec 替换 shell 而不创建新进程
请提供一个用例/实际示例。我不明白这是怎么回事。
我用谷歌搜索并找到了I/O redirection。你能解释得更好吗?
我正在将一些软件从 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) 我有一台服务器,我需要重新挂载 /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 或更改挂载。
谢谢,
exec ×10
bash ×7
linux ×2
shell ×2
shell-script ×2
command-line ×1
fork ×1
mount ×1
stderr ×1
tmp ×1