小编Tra*_*iet的帖子

在 Bash 中,文件描述符 255 是做什么用的,我可以使用它吗?

我理解文件描述符(或文件处理程序)是Linux 系统中的一种文件 IO 技术

我也知道每个进程都有 3 个标准流(即 stdin、stdout 和 stderr),它们由描述符从 0 到 3 的文件表示。

但是,我注意到我检查的所有进程lsof -p <pid>都有一个255具有读取权限的额外文件描述符。

这个答案中,我了解到这个特性是特定于Bash shell 的,但是答案和引用的来源都没有真正解释这个文件描述符的用途。

我的问题:

  1. 255 文件描述符有什么用?
  2. 我可以在我的 Bash 脚本中使用它还是它只是一个不应手动使用/操作的内部工作机制?

bash file-descriptors

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

Diff 输出“二进制文件 &lt;file1&gt; &lt;file2&gt; 不同”但不是通常的细节输出

我想比较两个文件——“orienv”和“currenv”,使用命令diff.

我创建这两个文件的方式如下:

  1. 创建“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)
  2. 创建 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的差异,指示哪个文件具有另一个文件没有的信息。

什么地方出了错?

diff proc cat

5
推荐指数
1
解决办法
4383
查看次数

coproc &lt;命令&gt; 与 &lt;命令&gt; &amp; 相同吗?

我读过的内容$coproc < command >不同于$< command > &与在子 shell 进程中coproc执行的command

但当我测试它时,它的工作原理就像$< command > &. 测试如下:

第一:测试行为$< command > &

  1. 跑步$nano &在tty1
  2. 在另一个 tty 上,输出来自$ps -t tty1 --forest表明 nano 进程是 -bash 进程的子进程(登录 bash shell 进程 -> 未创建子 shell 进程)

第二:测试行为$coproc < command >

  1. 跑步$coproc nano在tty1
  2. 在另一个 tty 上,输出来自$ps -t tty1 --forest上面相同(没有创建子 shell 进程)

也是如此$coproc < command >和一样吗$< …

bash coprocesses

5
推荐指数
1
解决办法
2305
查看次数

为什么源(或点命令)不要求文件是可执行的

从跑步help .help source

从当前 shell 中的文件执行命令。

在当前 shell 中从 FILENAME 读取和执行命令。$PATH 中的条目用于查找包含 FILENAME 的目录。

从我的角度来看,似乎 dot 命令(或source命令)只是在当前 shell 上下文中运行一个 shell 脚本(而不是生成另一个 shell)。

问题:为什么.(或source)不要求文件像运行普通脚本一样可执行?

shell shell-script

3
推荐指数
1
解决办法
1626
查看次数

什么是非标准输入/输出/错误

我读过提到标准输入/输出/错误的书籍/教程。我的理解是:

  1. standard input/output/error are concepts of a process (i.e. if someone mentions standard input/output/error, they are actually talking about standard input/output/error of a particular process. It doesn't make sense to talk about standard input/output/error of a file.)
  2. Standard input in Linux for most processes is keyboard and standard output/error is screen.

My question: if there's the standard, what is the non-standard input/output/error of a process in Linux?

stdout stdin stderr

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

env 和 printenv 显示哪些环境变量/shell 变量

我已经看到了相关的问题,比如这个,但他们没有提供确切的回答我的问题

从我的实验以及这个答案printenvenv几乎表现出相同的设定的系统变量。

如果我将变量设置在

  1. /etc/bash.bashrc(应该用于系统范围的系统变量)

    SYSTEM_ENVI=1000
    
    Run Code Online (Sandbox Code Playgroud)
  2. ~/.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)

我的问题是:

  1. 什么系统变量做printenv/env打印?
  2. 应该使用set查看所有可访问的变量(系统变量和局部变量)而不是printenvorenv吗?

关于不重复的理由

就我而言,这个问题和明显的答案帮助我意识到以下事实:

  1. Shell变量不是环境变量
  2. /etc/bash.bashrc~/.bashrc 中的赋值不会创建环境变量,而是指示交互式非登录 …

environment-variables

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