我理解文件描述符(或文件处理程序)是Linux 系统中的一种文件 IO 技术。
我也知道每个进程都有 3 个标准流(即 stdin、stdout 和 stderr),它们由描述符从 0 到 3 的文件表示。
但是,我注意到我检查的所有进程lsof -p <pid>
都有一个255
具有读取权限的额外文件描述符。
从这个答案中,我了解到这个特性是特定于Bash shell 的,但是答案和引用的来源都没有真正解释这个文件描述符的用途。
我的问题:
我想比较两个文件——“orienv”和“currenv”,使用命令diff
.
我创建这两个文件的方式如下:
创建“currenv”文件
$cat /proc/1/environ >> currenv
$cat /pcoc/279/environ >> currenv
$cat /proc/295/environ >> currenv
//295 is the pid of the current console
Run Code Online (Sandbox Code Playgroud)创建 orienv 文件
$printenv > orienv
Run Code Online (Sandbox Code Playgroud)然后我打电话diff
如下
diff -u orienv currenv
Run Code Online (Sandbox Code Playgroud)
并得到以下输出
二进制文件 orienv 和 currenv 不同
我期待diff
带有标志的正常输出-u
(例如,在输出中它显示了hunks的差异,指示哪个文件具有另一个文件没有的信息。
什么地方出了错?
我读过的内容$coproc < command >
不同于$< command > &
与在子 shell 进程中coproc
执行的command
但当我测试它时,它的工作原理就像$< command > &
. 测试如下:
第一:测试行为$< command > &
。
$nano &
在tty1上$ps -t tty1 --forest
表明 nano 进程是 -bash 进程的子进程(登录 bash shell 进程 -> 未创建子 shell 进程)第二:测试行为$coproc < command >
$coproc nano
在tty1上$ps -t tty1 --forest
上面相同(没有创建子 shell 进程)也是如此$coproc < command >
和一样吗$< …
从跑步help .
或help source
从当前 shell 中的文件执行命令。
在当前 shell 中从 FILENAME 读取和执行命令。$PATH 中的条目用于查找包含 FILENAME 的目录。
从我的角度来看,似乎 dot 命令(或source
命令)只是在当前 shell 上下文中运行一个 shell 脚本(而不是生成另一个 shell)。
问题:为什么.
(或source
)不要求文件像运行普通脚本一样可执行?
我读过提到标准输入/输出/错误的书籍/教程。我的理解是:
My question: if there's the standard, what is the non-standard input/output/error of a process in Linux?
我已经看到了相关的问题,比如这个,但他们没有提供确切的回答我的问题
从我的实验以及这个答案,printenv
并env
几乎表现出相同的设定的系统变量。
如果我将变量设置在
/etc/bash.bashrc(应该用于系统范围的系统变量)
SYSTEM_ENVI=1000
Run Code Online (Sandbox Code Playgroud)~/.bashrc (应该用于用户特定的系统变量)
USER_ENVI=10
Run Code Online (Sandbox Code Playgroud)我什至注销并登录,以便 /etc/environment 生效。发生以下场景:
$echo $SYSTEM_ENVI
//outputs 1000
$echo $USER_ENVI
//outputs 10
$CURR_ENVI=1
$env | grep USER_ENVI
//nothing shows up, the same if I grepped SYSTEM_ENVI or CURR_ENVI
$set | grep USER_ENVI
//shows up USER_ENVI assignment, the same if I grepped SYSTEM_ENVI or CURR_ENVI
Run Code Online (Sandbox Code Playgroud)
我的问题是:
printenv
/env
打印?set
查看所有可访问的变量(系统变量和局部变量)而不是printenv
orenv
吗?关于不重复的理由
就我而言,这个问题和明显的答案帮助我意识到以下事实:
bash ×2
cat ×1
coprocesses ×1
diff ×1
proc ×1
shell ×1
shell-script ×1
stderr ×1
stdin ×1
stdout ×1