linux标准输出 1<&2,linux bash关闭标准输出1(exec 1<&-)后重新打开

本文介绍了在Linux环境下如何使用bash shell进行文件描述符的重定向操作,特别是针对标准输入(stdin)、标准输出(stdout)及标准错误输出(stderr)的文件描述符0、1和2的重定向,并通过具体实例展示了如何将它们重新连接到同一终端。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

标签:

linux bash shell的再次学习。

文件描述符:

stdin,stdout 和 stderr 的文件描述符分别是 0,1 和 2(一个文件描述符说白了就是文件系统为了跟踪这个打开的文件而分配给它的一个数字)

这样子来读入文件fly的内容

bb04d2d5f6c80ea0767681bb1056793d.png

清空文件

2322565dbdc45dee9952c9ca6f8f74c4.png

----------------------------------------------------------------------------

I am running this on an Ubuntu machine, so I am not sure if it'll work for you, but this is what I did:

$ exec 1>&0

$ exec 2>&0

Suddenly, I had STDOUT and STDERR reconnected. Magic!

Explanation: Running the following commands, we get the following output:

$ ls -l /dev/stdout

lrwxrwxrwx 1 root root 15 Jun 11 23:39 /dev/stdout -> /proc/self/fd/1

$ ls -l /proc/self/fd/1

lrwx------ 1 jay jay 64 Jun 22 01:34 /proc/self/fd/1 -> /dev/pts/10

$ ls -l /proc/self/fd/

total 0

lrwx------ 1 jay jay 64 Jun 22 01:35 0 -> /dev/pts/10

lrwx------ 1 jay jay 64 Jun 22 01:35 1 -> /dev/pts/10

lrwx------ 1 jay jay 64 Jun 22 01:35 2 -> /dev/pts/10

lr-x------ 1 jay jay 64 Jun 22 01:35 3 -> /proc/12224/fd

Since all three fd's point to the same thing, we can return them back to normal just by pointing to /dev/pts/10 which the exec 1>&0 and exec 2>&0 do

标签:

来源: https://www.cnblogs.com/oxspirt/p/10249562.html

<think>好的,用户现在问的是“&怎么用”。首先,我需要回顾之前的对话历史。用户之前询问了关于C语言中的按位与运算符在判断偶数函数中的应用,我详细解释了`isEven`函数中使用`num & 1`的原理。现在用户的问题更广泛,询问的是“&”的用法,可能是指在不同上下文中的使用,比如C语言中的按位与、逻辑与,或者是其他语言中的类似操作符,甚至可能是其他领域如HTML中的&符号实体。 首先,用户的问题比较简短,只有一个符号“&”,所以需要确认用户的具体使用场景。但根据之前的对话历史,用户之前询问的是C语言代码,所以很可能是在编程语境下询问按位与或逻辑与运算符的使用。不过,也有可能用户在其他地方遇到了这个符号,比如在HTML中,&用来表示特殊字符实体,比如`&`代表&本身。 接下来,我需要考虑用户可能的真实需求。用户可能刚开始学习编程,尤其是C语言,所以在学习了按位与之后,想进一步了解&的其他用法,比如逻辑与(&&),或者取地址运算符(&)。或者用户可能在使用其他语言时遇到了&的不同用法,比如在C++中的引用声明,或者在Shell脚本中的后台进程。也有可能用户在处理HTML或XML时遇到了&的问题,需要解释转义字符的使用。 由于用户之前的问题集中在C语言,我应该优先考虑C/C++中的&运算符的不同用法。需要分清楚按位与、逻辑与、取地址运算符的区别。同时,可能需要提到其他语言中的不同用法,但主要应集中在C/C++上,除非用户有其他暗示。 另外,用户可能没有明确说明是哪个上下文中的&,所以我的回答需要覆盖常见的几种情况,但需要结构清晰,避免混淆。例如,在C语言中,&有三种主要用途:按位与、逻辑与(&&)、取地址运算符。需要逐一解释,给出例子,并说明它们的不同之处。 同时,考虑到用户可能是初学者,需要用简单易懂的语言,避免使用过多术语,或者在使用术语时给出解释。例如,解释按位与时,可以再次提到之前的例子,比如判断奇偶性,而取地址运算符则用于指针操作,逻辑与用于布尔表达式中的条件判断。 此外,还要注意语法格式,比如在C中,按位与是单个&,而逻辑与是双个&&,取地址也是单个&。需要明确区分这些,避免用户混淆。可能还需要给出代码示例,说明正确的使用方式和常见错误,比如错误地使用单个&代替逻辑与,导致意外的行为。 另外,需要提到其他语言中的差异,比如在Java和JavaScript中,&同样有按位与和逻辑与的用法,但逻辑与通常使用&&,而单个&可能在某些上下文中有不同的行为。在HTML中,&用于转义字符,这也是常见的用法,尤其是在web开发中,用户可能会遇到需要转义&的情况,比如写成&。 最后,需要总结&的不同用法,帮助用户根据上下文识别正确的使用方式,并提醒注意在不同语言和环境中的区别,避免混淆和错误。同时,可以建议用户提供更多上下文,以便更准确地解答,或者询问是否有特定的使用场景需要进一步解释。</think>--- ### 一、符号 `&` 的核心用途分类 | 使用场景 | 功能描述 | 示例代码 | |----------------|----------------------------|---------------------------| | **位运算** | 按位与操作(二进制逐位比较) | `int a = 5 & 3; // 0101 & 0011 = 0001 → a=1` | | **逻辑运算** | 逻辑与(部分语言中使用) | `if (condition1 & condition2)`(注意:C/C++中需用 `&&`) | | **地址操作** | 取变量地址(C/C++指针) | `int* ptr = #` | | **引用声明** | 声明引用(C++特性) | `int& ref = num;` | | **特殊转义** | HTML/XML 中表示特殊字符 | `&` → 显示为 `&` | --- ### 二、编程语言中的具体用法详解 #### 1. **按位与运算(Bitwise AND)** - **规则**:两个二进制位**同时为1**时结果为1,否则为0 - **典型用途**: - 奇偶性判断:`num & 1`(最低位为0则是偶数) - 掩码操作:提取特定位 `flags & 0x0F` - 关闭权限位:`permission &= ~(1 << 2)` **代码示例**: ```c int a = 6; // 二进制 0110 int b = 3; // 二进制 0011 int c = a & b; // 结果 0010 → 十进制2 ``` #### 2. **逻辑与运算(Logical AND)** - **注意**:在C/C++中**必须使用 `&&`**(单`&`会执行按位与) - **短路特性**:若第一个条件为假,则不再检查第二个条件 **正确用法**: ```c if (x > 0 && x < 100) { // 使用双&& // 安全范围判断 } ``` **错误示例**: ```c if (x > 0 & x < 100) { // 实际执行按位与运算,可能导致逻辑错误 // 当x=5时:00000101 & 01100100 → 00000100 → 非零即视为true } ``` #### 3. **取地址操作符(C/C++)** - **核心作用**:获取变量内存地址 - **指针初始化**时必须使用 **代码示例**: ```c int num = 10; int* ptr = # // ptr存储num的内存地址 printf("%p", ptr); // 输出类似0x7ffd42d3aecc ``` #### 4. **引用声明(C++)** - **本质**:变量的别名(与指针不同,引用必须初始化且不可改变绑定) **代码示例**: ```cpp int original = 5; int& ref = original; // ref是original的别名 ref = 8; // 实际修改original的值 ``` --- ### 三、特殊场景用法 #### 1. **Shell脚本中的后台执行** ```bash command & # 将命令放入后台执行 ``` #### 2. **HTML/XML字符实体** | 写法 | 显示结果 | 用途说明 | |------------|----------|----------------------| | `&` | & | 显示&符号本身 | | `<` | < | 避免被识别为标签开头 | | ` ` | 空格 | 非换行空格 | --- ### 四、易混淆点对比表 | 操作符 | 语言 | 含义 | 示例 | |--------|-----------|-----------------------|------------------------| | `&` | C/C++ | 按位与/取地址 | `a & b`, `&var` | | `&&` | C/C++ | 逻辑与 | `cond1 && cond2` | | `&` | Java | 非短路逻辑与 | `boolean a = (x>0) & (y<10)` | | `&` | Python | 仅支持按位与 | `3 & 5 → 1` | | `&` | CSS | 嵌套规则 | `.parent { & .child {...} }` | --- ### 五、使用注意事项 1. **优先级问题**: `&` 运算符优先级低于比较运算符 ```c if (x & MASK == 0) // 实际等价于 x & (MASK == 0) if ((x & MASK) == 0) // 正确写法 ``` 2. **符号位处理**: 对有符号数进行位操作时可能产生意外结果 ```c int a = -5; // 二进制补码表示:11111011 int b = a & 0xFF; // 强制保留低8位 → 251(可能非预期) ``` 3. **类型安全**: C++中引用声明必须匹配类型 ```cpp double d = 3.14; int& r = d; // 错误:无法将double引用绑定到int ``` --- ### 六、经典应用场景 1. **权限管理系统** 使用位掩码管理权限组合: ```c #define READ 0x1 // 0001 #define WRITE 0x2 // 0010 #define EXEC 0x4 // 0100 int user_perm = READ | WRITE; // 0011 if (user_perm & WRITE) { ... } // 检查写权限 ``` 2. **高效算法实现** 快速判断2的幂: ```c bool isPowerOfTwo(int num) { return (num > 0) && ((num & (num - 1)) == 0); } ``` 3. **内存地址操作** 直接操作硬件寄存器(嵌入式开发): ```c volatile uint32_t* reg = (uint32_t*)0x40021000; *reg |= 0x1; // 设置最低位 ``` --- 请根据具体使用场景选择正确的操作方式,注意不同语言和环境中的差异。如果需要更具体的解释,请提供完整上下文。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值