我知道,nohup作为一个二进制文件,它可以从任何 shell 访问。但是exec内置的可能存在于每个 shell 中。
是否有理由更喜欢其中一个?
在 bash 脚本中,如何使用 将所有标准输出重定向到日志文件和tee屏幕上的输出exec?
log_file="$HOME/logs/install.txt-`date +'%Y-%m-%d_%H-%M-%S'`"
[ -f "$log_file" ] || touch "$log_file"
exec 1>> $log_file 2>&1
Run Code Online (Sandbox Code Playgroud)
此代码将所有日志重定向到日志文件而不是屏幕。
所以,我以为我对此有一个很好的理解,但只是进行了一个测试(以回应我不同意某人的对话)并发现我的理解有缺陷......
尽可能详细地说明当我在 shell 中执行文件时到底发生了什么?我的意思是,如果我输入:./somefile some arguments进入我的 shell 并按回车键(并且somefile存在于 cwd 中,并且我有读取+执行权限somefile),那么引擎盖下会发生什么?
我以为答案是:
exec,将路径传递给somefilesomefile并查看文件的幻数,以确定它是否是处理器可以处理的格式somefile被读取/映射到内存。创建堆栈并执行跳转到代码的入口点somefile,并ARGV初始化为参数数组 (a char**, ["some","arguments"])exec()如上所述生成一个新进程,但使用的可执行文件是shebang(例如/bin/bash或/bin/perl)引用的解释器并somefile传递给STDIN但是有人告诉我,如果文件是纯文本,那么 shell 会尝试执行命令(就像我输入了bash somefile)。我不相信这一点,但我只是尝试了一下,结果是正确的。所以我显然对这里实际发生的事情有一些误解,并想了解机制。
当我在我的 shell 中执行一个文件时到底发生了什么?(尽可能多的细节是合理的......)
我看过包装脚本示例,简而言之如下:
#!/bin/bash
myprog=sleep
echo "This is the wrapper script, it will exec "$myprog""
exec "$myprog" "$@"
Run Code Online (Sandbox Code Playgroud)
如上所示,它们exec几乎立即用$myprog. 一个人可以在没有exec:
#!/bin/bash
myprog=sleep
echo "This is the wrapper script, it will exec "$myprog""
"$myprog" "$@"
Run Code Online (Sandbox Code Playgroud)
在最后一个示例中,启动了一个新的 bash 实例,然后$myprog作为 bash 实例的子进程启动。
第一种方法有什么好处?
那是字面意思,{fd}不是占位符。我有一个执行此操作的脚本,并且不引用任何内容,也不引用其他任何地方的 {fd}。这是有效的 bash 吗?
exec {fd}</dev/watchdog
我发现很难准确地表达这个问题,但我会尽力而为。我dwm用作我的默认窗口管理器和dmenu作为我的应用程序启动器。除了浏览器,我几乎不使用 GUI 应用程序。我的大部分工作都是直接从命令行完成的。此外,我非常喜欢操作系统、应用程序等方面的极简主义。我从未摆脱过的工具之一是应用程序启动器。主要是因为我对应用程序启动器的工作方式/它们的作用缺乏准确的了解。即使是广泛的互联网搜索也只能得到模糊的解释。我想要做的是摆脱我的应用程序启动器,因为除了实际生成应用程序之外,我完全没有用它。为了做到这一点,我真的很想知道如何从外壳“正确”启动应用程序。因此,“正确地”的含义可以近似为“就像应用程序启动器会做的那样”。
我知道以下从 shell 生成进程的方法:
exec /path/to/Program 用指定的命令替换 shell 而不创建新进程sh -c /path/to/Program 启动 shell 依赖进程/path/to/Program 启动 shell 依赖进程/path/to/Program 2>&1 & 启动外壳独立进程nohup /path/to/Program & 启动独立于 shell 的进程并将输出重定向到 nohup.out更新 1:我可以说明例如在不同条件下dmenu从重复调用中重建它的内容ps -efl。它生成一个新的 shell/bin/bash并且作为这个 shell 的子应用程序/path/to/Program。只要孩子在身边,贝壳就会在身边。(它如何管理这超出了我的能力......)相反,如果你nohup /path/to/Program &从一个 shell发出,/bin/bash那么程序将成为这个 shell 的子进程,但是如果你退出这个 shell,程序的父进程将是最上层的进程。因此,如果第一个进程是 eg/sbin/init verbose并且它有,PPID 1那么它将是程序的父进程。这里就是我试图用一个图表来解释:chromium推出通过dmenu,firefox使用推出exec firefox & exit:
systemd-+-acpid
|-bash---chromium-+-chrome-sandbox---chromium-+-chrome-sandbox---nacl_helper …Run Code Online (Sandbox Code Playgroud) 在 C 中,运行标准实用程序(例如 ps)而不是其他的最简单方法是什么?
例如,POSIX 是否保证存在标准ps,/bin/ps或者我应该将 PATH 环境变量重置为我所获得的值confstr(_CS_PATH, pathbuf, n);,然后通过 PATH-search 运行该实用程序?
我正在使用 Linux 服务器开发一个 php 应用程序。我的问题是执行shell_exec()调用某些 exe 文件不起作用(实际上不是 exe,它是一种 linux 可执行文件)
echo shell_exec("whoami");
Run Code Online (Sandbox Code Playgroud)
我有守护进程
echo shell_exec("ls")
Run Code Online (Sandbox Code Playgroud)
我有一些文件名但是
echo shell_exec("php -v")
Run Code Online (Sandbox Code Playgroud)
我什么都没有,一个空白页
echo shell_exec("php ....bla bla bla")
Run Code Online (Sandbox Code Playgroud)
也是空白页。
如果我在终端(用户 hu)上输入,所有这些命令都将起作用。我已经在谷歌上搜索了几个小时,人们说这是因为许可。我没有在 Linux 上的经验。我必须做什么才能在 php 中执行我的程序?
我没有太多经验,只是试图参与他们如何从用户级别解释到硬件的过程。
因此,当从 shell 触发命令时,fork()继承它exec()的子进程并将子进程加载到内存中并执行。
fork和exec概念是否适用于 UNIX 中的所有可执行程序?也喜欢shell脚本还是只喜欢命令?它是否也适用于 shell 内置命令?很抱歉一次问了很多问题,但是当我想到任何命令执行时,所有这些问题都会立刻浮现在我的脑海中。