首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么shell在父目录中保存、复制和恢复重定向的描述符,而不是在子目录中进行重定向?

Shell 在父目录中保存、复制和恢复重定向的描述符,而不是在子目录中进行重定向,这是因为 Shell 的工作方式和重定向机制的设计原理。

基础概念

  1. Shell:Shell 是一个命令行解释器,它允许用户与操作系统进行交互。它负责解析用户输入的命令并执行相应的操作。
  2. 文件描述符:文件描述符是操作系统用来标识打开文件的整数。常见的文件描述符包括标准输入(0)、标准输出(1)和标准错误(2)。
  3. 重定向:重定向是指将命令的输入或输出从一个文件或设备转移到另一个文件或设备。例如,> 用于将输出重定向到文件,< 用于将输入重定向自文件。

为什么在父目录中进行重定向?

  1. 工作目录的独立性:每个进程都有自己的工作目录,这个目录是相对于进程启动时的目录。子进程会继承父进程的工作目录,但它们可以独立更改自己的工作目录。如果在子目录中进行重定向,可能会导致路径解析的复杂性。
  2. 一致性和可预测性:在父目录中进行重定向可以确保路径的一致性和可预测性。父目录通常是用户期望的操作起点,这样可以避免因子目录路径变化而导致的错误。
  3. 权限和安全:父目录通常具有更高的权限控制,确保重定向操作的安全性。在子目录中进行重定向可能会引入额外的安全风险,特别是在多用户环境中。

优势

  • 简化路径解析:在父目录中进行重定向可以简化路径解析,避免复杂的相对路径计算。
  • 提高可维护性:代码的可读性和可维护性更高,因为所有操作都基于一个共同的起点。
  • 增强安全性:通过限制重定向的范围,可以减少潜在的安全漏洞。

类型与应用场景

  1. 标准输出重定向:将命令的输出保存到文件中,例如 command > output.txt
    • 应用场景:日志记录、结果保存。
  • 标准输入重定向:从文件读取输入,例如 command < input.txt
    • 应用场景:自动化脚本、数据处理。
  • 标准错误重定向:将错误信息重定向到文件或设备,例如 command 2> error.log
    • 应用场景:错误跟踪、调试。

示例代码

代码语言:txt
复制
# 将标准输出重定向到文件
ls -l > file_list.txt

# 将标准输入重定向自文件
sort < numbers.txt

# 将标准错误重定向到文件
command_that_might_fail 2> error.log

# 同时重定向标准输出和标准错误
command_with_both > output_and_error.log 2>&1

遇到的问题及解决方法

问题:在子目录中进行重定向时,路径解析出现问题,导致文件无法正确找到。 原因:子进程的工作目录可能与父进程不同,导致相对路径解析错误。 解决方法

  1. 使用绝对路径:始终使用绝对路径进行重定向,避免相对路径带来的不确定性。
  2. 使用绝对路径:始终使用绝对路径进行重定向,避免相对路径带来的不确定性。
  3. 保存和恢复工作目录:在执行子命令前保存当前工作目录,执行完毕后再恢复。
  4. 保存和恢复工作目录:在执行子命令前保存当前工作目录,执行完毕后再恢复。

通过理解这些基础概念和机制,可以更好地掌握 Shell 中重定向的行为和最佳实践。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

MIT 6.S081 (BOOK-RISCV-REV1)教材第一章内容 --- 操作系统接口

如果exec成功,那么子进程将从echo而不是runcmd执行命令,在某刻echo会调用exit,这将导致父进程从main(*user/sh.c:78*)中的wait返回。...你或许想知道为什么exec和fork没有组合成为一个系统调用,稍后我们将会看到shell在其I/O重定向的实现中利用了这种分离。...O_TRUNC 将文件截断为零长度 现在应该很清楚为什么fork和exec分离的用处了: 在这两个调用之间,shell有机会对子进程进行I/O重定向,而不会干扰主shell的I/O设置。...父进程中的写操作(由于等待,只有在子进程完成后才运行)在子进程停止写入的位置进行。...例如,只需进行上述的修改,sleep 10 | echo hi将立即打印“hi”,而不是在10秒后,因为echo将立即运行并退出,而不是等待sleep完成。

30621

【翻译】XV6-DRAFT as of September 3,2014 第0章 操作系统接口

当一个进程不再执行而让出CPU时,Xv6保存了该进程的CPU上某些相关寄存器中的内容,方便该进程在下次占用CPU时恢复到上次运行的状态并接着运行。...Xv6通常隐式地分配用户空间的内存:当子进程复制父进程的内存时,fork为子进程分配内存,而exec分配了足够的内存来保存可执行文件。...文件描述符与fork的共同作用,使得I/O重定向易于实现。fork复制父进程的文件描述符表与内存,所以子进程具有与父进程完全相同的文件描述符。...现在你应该很清楚为什么把fork与exec分开调用是个好主意了:这种分离使得shell可以在子进程执行指定程序之前对子进程进行修改。...2>&1通知shell把文件描述符2给命令,这个文件描述符2是文件描述符1的拷贝。已存在的文件名称与因文件不存在而引发的错误信息将显示在文件temp1中。

60560
  • 《Linux命令行与shell脚本编程大全》第十五章 呈现数据

    shell或shell中运行的程序和脚本出错时生成的错误消息都会发送到这个位置。 默认情况下STROUT和STDERR指向同样的地方(显示器)。但是STDERR不会随着STDOUT重定向而发生改变。...而正常输出还是在屏幕上。 15.2.2 永久重定向 如果有大量数据需要重定向,那么就会比较麻烦。 新方法:用exec命令告诉shell在脚本执行期间重定向某个特定文件描述符 直接上例子: 1 #!...创建输入文件描述符 跟上面类似,先将STDIN保存到另外一个文件描述符,然后读取完文件在将STDIN恢复 例子:   1 #!...可以利用同一个文件描述符对同一个文件进行读写。 用起来要小心:由于是对同一个文件进行数据读写,shell会维护一个内部指针,指明在文件中的当前位置。任何读或写都是从文件指针上次的位置开始。...大部分linux发行版配置了系统在启动时自动删除/tmp目录下的所有文件。 系统上的任何用户账户都有权限在读写/tmp目录中的文件。 mktemp可以在/tmp目录中创建一个唯一的临时文件。

    1.4K60

    Python实现守护进程

    # 退出子进程 sys.exit(0) # 此时,孙子进程已经是守护进程了,接下来重定向标准输入、输出、错误的描述符(是重定向而不是关闭, 这样可以避免程序在...父进程之所以退出,是因为终端敲击键盘、或者关闭时给它发送了信号;而fork出来的子进程,在父进程自杀后成为孤儿进程,进而被操作系统的init进程接管,因此脱离终端控制。...umask权限掩码 我们知道,在Linux中,任何一个文件都有读(read)、写(write)和执行(execute)的三种使用权限。其中,读的权限用数字4代表,写权限是2,执行权限是1。...因此,上面代码中,子进程可以调用setsid(),而父进程不能,因为它本身就是会话组长。...3、守护进程改变了会话、进程组、工作目录和文件描述符,后台进程直接继承父进程(shell)的 换句话说:守护进程就是默默地奋斗打拼的有为青年,而后台进程是默默继承老爸资产的富二代。

    2K80

    Linux命令中的重定向(>)和管道(|)的讲解

    在日常使用Linux命令时候,经常使用重定向或者管道的方式处理命令的结果。以前对这两个命令的使用场景存在一些困惑,所以本文对这两个命令进行详细的总结。...我们又知道,在Linux中,子进程会继承父进程的文件描述符,所以说,Linux中每个程序,执行的每个shell命令,拥有这三个文件描述符,而程序后续打开的文件,其文件描述符则(从3开始)依次增加。...对于一条shell命令,其从标准输入(键盘)中获得输入,如果执行成功,则将输出打印在标准输出(屏幕)上;如果执行出错,将结果打印在标准错误(屏幕)上。...* 一条命令在执行前,先会检查输出是否正确,如果输出设备错误,将不会进行命令执行输入重定向输入重定向和输出重定向类似,其格式为:command [n] 描述符或者设备 示例:cat >...管道和重定向的区别管道触发两个子进程,执行|两边的程序;而重定向是在一个进程内执行。

    96110

    Linux系统常用命令详解

    在Linux中每个用户都有一个自己的目录,一般该目录名是以用户的账户命名 /etc: 所有的系统管理员所需要的配置文件和子目录 /usr:非常重要的目录,用户的很多应用程序和文件都在这个目录...尽管在一些现代Linux发行版中已被标记为过时工具,但它仍然是一种经典而强大的工具。...2、&表示什么意思 在重定向中,&的作用是将文件描述符(File Descriptor)与目标关联起来。...但是对于错误输出重定向(文件描述符为 2),必须明确写为command 2> error.txt,因为它没有默认的简化形式。 为什么需要&?...1:表示将文件描述符2重定向到文件描述符1所指向的地方(此处是output.txt) 如果没有&,例如写成2>1,会将标准错误输出到名为1的文件中,而不是文件描述符1 &的含义是“引用文件描述符的编号

    16810

    06-1重定向

    1.标准输出重定向 I/O 重定向功能可以重新定义标准输出内容发送的目的地。 使用重定向操作符“ > ”,后面接文件名,就可以把标准输出重定向到另一个文件中,而不是显示在屏幕上。...(0)用法格式 命令 > 文件名 (1)为什么? 主要用于把命令的输出内容保存到一个文件中。...(2)例 ① 示例1 比如我们创建 /usr/bin 目录的一个长列表信息,并把这个结果输出到 ls-output.txt 文件中,而不是输出到屏幕上。...ls -l /bin/usr > ls-output.txt 我们会收到一条错误信息,因为我们指定的是一个不存在的目录,所以这个错误信息是正确的,但是为什么这个错误信息显示在屏幕上,而不是重定向到 ls-output-noexist.txt...一个程序可以把生成的输出内容发送到任意文件流中,如果把这些文件流中的前三个分别对应标准输入文件、标准输出文件 和 标准错误文件,那么 shell 将在内部用文件描述符分别索引他们为 0、1 和 2 。

    86120

    Shell脚本管道符与重定向

    命令执行,都会继承父进程的文件描述符因此,所有运行的shell命令,都会有默认3个文件描述符。...,命令的输入,正确输出,错误输出,默认分别绑定0,1,2文件描述符 5、一条命令在执行前,先会检查输出是否正确,如果输出设备错误,将不会进行命令执行 (3)输入重定向 #基础语法 command-line...1>suc.txt ls -al ##执行命令,发现什么都不返回了,因为标准输出已经输出到suc.txt文件了 $exec 1>&6 ##恢复标准输出 #示例3.关闭fd 6描述符 #说明:使用前先将标准输入保存到文件描述符...EOF #示例2.在shell脚本中进行使用 #!...”命名管道”),它是一种特殊的文件类型,它允许独立的进程通讯(反弹Shell你懂的) 一个进程打开FIFO文件进行写操作,而另一个进程对之进行读操作, 然后数据便可以如同在shell或者其它地方常见的的匿名管道一样流线执行

    1.8K42

    Shell脚本管道符与重定向

    命令执行,都会继承父进程的文件描述符因此,所有运行的shell命令,都会有默认3个文件描述符。...,命令的输入,正确输出,错误输出,默认分别绑定0,1,2文件描述符 5、一条命令在执行前,先会检查输出是否正确,如果输出设备错误,将不会进行命令执行 (3)输入重定向 #基础语法 command-line...描述:Here Document(”嵌入文档“)是 Shell 中的一种特殊的重定向方式,它的基本的形式如下: 和结束标记 delimiter...EOF #示例2.在shell脚本中进行使用 #!...”命名管道”),它是一种特殊的文件类型,它允许独立的进程通讯(反弹Shell你懂的) 一个进程打开FIFO文件进行写操作,而另一个进程对之进行读操作, 然后数据便可以如同在shell或者其它地方常见的的匿名管道一样流线执行

    1K00

    如何优雅地将printf的打印保存在文件中?

    我们都知道,一般使用printf的打印都会直接打印在终端,如果想要保存在文件里呢?我想你可能想到的是重定向。...例如: $ program > result.txt 这样printf的输出就存储在result.txt中了。相关内容可以参考《如何理解Linux shell中“2>&1”》。...但是本文并不是说明如何实现一个logging功能,而是如何将printf的原始打印保存在文件中。...除了上面这种方式,还有一种方式是使用dup2: int dup2(int oldfd, int newfd); 它是用来复制文件描述符的,会使得newfd成为oldfd的副本.所以与上面看到不同的是,标准输出和往...有些后台进程有自己的日志记录方式,而不想让printf的信息打印在终端,因此可能会关闭。 总结 文本旨在通过将printf的打印保存在文件中来介绍重定向,以及0,1,2文件描述符。

    10.1K31

    如何理解 Linux shell中“2>&1”?

    由于系统中不存在whatthis命令,因此执行会报错。 假如我们想保存该脚本的打印结果,只需将test.sh的结果重定向到log.txt中即可: ....那么现在就容易理解前面的疑问了,2>&1表明将文件描述2(标准错误输出)的内容重定向到文件描述符1(标准输出),为什么1前面需要&?...当没有&时,1会被认为是一个普通的文件,有&表示重定向的目标不是一个文件,而是一个文件描述符。.../home/hyb/workspaces/shell/log.txt 255 -> /home/hyb/workspaces/shell/test.sh 我们可以很明显地看到,文件描述符1和2都指向了...在调用脚本时,可使用2>&1来将标准错误输出重定向。 只需要查看脚本的错误时,可将标准输出重定向到文件,而标准错误会打印在控制台,便于查看。

    90230

    大数据学习之Linux基础

    编写shell 脚本案例——递归子目录 自定义Linux虚拟机安装 点击新建虚拟机 ?...注意 : 即使安装了中文包, 也不是每个命令都会被翻译成中文 文本流和重定向 # 文件描述符fd cd /proc/$$/fd +tab键 ( $$就会转换成进程当前shell的id) # 查看文件描述符...重定向 输出重定向 #输入重定向 # 见图1 1>xxx 标准输出覆盖重定向 1>>xxx 标准输出追加重定向 # 见图2 2>xxx 错误覆盖重定向 2>>xxx 错误追加重定向 # 在一个文件中如果同时输出标准输出内容和错误内容...注意: test 应当总是在花括号中包围着。如果不是这样,在 for 命令开始之前就 作了变量替换,这意味着在循环体中做的变量变更在表达式中将不被考虑。...编写shell 脚本案例——判断目录下最大文件 思路 用户给定路径 输出文件大小最大的文件 递归子目录 脚本内容 #!

    1.4K40

    常用命令、组合命令以及输入输出重定向

    -r选项告诉rm命令进入到它发现的每个子目录中去删除文件,而-f选项只是告诉rm命令完成任务但不要因为些细节问题(比如文件夹非空)而烦扰用户。...# 在当前目录下创建了两个目录 dir1 和 dir2 mkdir dir1 dir2 3.3.创建目录和中间必要的子目录 如果在当前目录下创建一个新目录,然后在再这个新目录中创建一个新的子目录,然后再创建子目录的子目录...就是在软链接的末端加了一个简单的斜杠(“/”)。 没有斜杠的话,移动的是软链接本身,而且只是这个链接; 有了斜杠的话,移动的将是软链接指定的目录,而不是软链接本身。 一定要小心啊!...当在shell中想快速成为root用户时,这个命令最常用,运行一两个命令,然后恢复到普通的非root用户。 调用su命令并不难。只要输入su,后面跟上你想要采用的用户身份就可以了。...与将stdout重定向到文件一样,也可以重定向stdin,让它接受来自文件而不是键盘的输入。 这有什么用呢? 有些命令不能直接打开文件,在这种情况下,的解决方法。

    1.7K30

    xv6(19) SHELL交互程序

    在说 $shell$ 实现之前先来看看 $shell$ 支持的两种机制,重定向和管道 重定向 重定向依赖于文件描述符这层抽象和 $fork$ 的实现机制。...而管道本身就是块内存区,在创建管道的时候就分配文件结构体文件描述符来描述这个管道。...这里提一句虽然在 $shell$ 里面区分了输出重定向的覆盖和追加两种情况,但实际 $xv6$ 还没有实现相应的功能,这需要我们自行添加这个功能,具体点就是从文件结构体中的偏移量入手。...$exec$ 的第一个参数是可执行程序的路径,所以准确的讲 $argv0$ 不是程序名,而是路径名,因为这些可执行程序都在根目录下,当前工作目录又是在根目录,所以说程序名也就当作是路径名了。...另外这最后解决前文控制台输入输出一文中遗留的一个问题,为什么在控制台键入 Ctrl + D 会导致 shell 退出,从这里我们看出如果 getcmd 函数返回的值小于 0 的话,那么 shell 就会执行

    39910

    小白也能学会的 Linux 基础命令(中)

    目录相关命令 在实际应用中,与目录相关的操作主要有两个:创建目录与删除目录。...如果是使用 cp 命令来复制文件夹,则 -r 就不是选项,而是必须项 注意:复制过程中文档的名称是不变的 用法一:复制 /root/readme.txt 到 /tmp 目录下 ?...在移动的过程中文档名称名称是不变的,变的是路径 剪切、移动文件: ? 剪切、移动文件夹: ? 3.3 重命名操作 在 Linux 中重命名的命令也是 mv,语法和移动语法一样。...4.2 tar 打包命令 gzip 、bzip2 或 xz 命令带有多个文件作为参数时,执行的操作是将各个文件独立压缩,而不是将其放在一起进行压缩。...输出重定向 场景:一般命令的输出都会显示在终端中,有些时候需要将一些命令的执行结果保存到文件中进行后续的 分析/统计,则这时候需要使用到 输出重定向技术。

    65630

    python 守护进程(daemon)

    inetd完成了    所有需要做的事情,包括重定向标准文件描述符,需要做的事情只有chdir()和umask()了 ''' def daemon(stdin='/dev/null', stdout=...stdout, 'a+')     se = open(stderr, 'a+')     os.dup2(si.fileno(), sys.stdin.fileno())  # dup2函数原子化关闭和复制文件描述符...1、fork子进程,父进程退出 通常,我们执行服务端程序的时候都会通过终端连接到服务器,成功连接后会加载shell环境,终端盒shell都是进程,shell进程是终端进程的子进程,通过ps命令可以很容易的查看到...,在这个shell环境下一开始执行的程序都是shell进程的子进程,自然会受到shell进程的影响,在程序里fork子进程后,父进程退出,对于shell进程来说,这个父进程就算执行完毕,而产生的子进程会被...2.修改子进程的工作目录 子进程在创建的时候会继承父进程的工作目录,如果执行的程序是在U盘里面,就会导致U盘不能卸载。

    1.1K30

    Linux 命令行操作和文件管理

    #以列表方式查看当前目录的所有子目录和文件(包含隐藏文件) ls -al /usr       #以列表方式查看 /usr 目录中的所有子目录和文件 值得注意的是:在Linux中,路径开头的“/”表示根目录...递归持续复制,用于目录的复制行为 -f 强制复制,有重复或疑问时不会询问 -p 保存源文件和目录的属性 -i 覆盖既有目录之前先询问 示例: cp /etc/profile Downloads/info...nano [文件名] nano常用命令(详见nano下方的提示菜单): (1)保存:Ctrl+O (2)退出:Ctrl+X (3)写入:Ctrl+W 4 输入输出和管道 重定向和管道允许用户认为改变程序输入和输出的位置...(1)输出重定向:“>”和“>>”        以下ls指令不会把目录列表显示出来,而是保存到一个名为ls_out的文件中。...而下面可以把文件ls_out的内容作为输入。 cat < ls_out        这和cat ls_out的效果一致,输入重定向并不常用。

    1.9K30

    如何在Bash Shell脚本中使用`exec`命令?

    3中,脚本首先保存了标准输入(文件描述符为0)到文件描述符3中(exec 3重定向到文件 input.txt。...接下来,脚本使用 echo 命令输出一行文本,该行文本将被重定向到文件而不是默认的标准输出。重定向标准错误输出:#!...在使用 exec 命令进行输入输出重定向时,请确保目标文件存在并具有适当的权限。否则,可能会出现错误。理解文件描述符的概念。文件描述符是与打开文件相关联的整数。...标准输入、输出和错误输出分别使用文件描述符0、1和2。总结exec 命令在Bash Shell脚本中的使用提供了灵活的功能。...您可以使用 exec 命令替换当前的Shell进程、切换到不同的命令解释器以及重定向标准输入、输出和错误输出。通过合理使用 exec 命令,您可以在Shell脚本中实现更高级的功能和控制。

    3.7K50

    Linux(一)

    格式: file [目标路径] ls ls 是英文 list 的缩写,用于列出文件。 在 Unix 和类 Unix 操作系统中都有当前目录的概念,也即程序目前在目录树中的位置。...GNU 版的 ls 根据文件的类型、扩展名和使用权限来决定颜色,而 FreeBSD 版的 ls 仅仅检查文件类型和使用权限。 常用参数: a: 列出目录下的所有文件,包括以 ....pwd 在类 Unix 系统和其他一些操作系统中,pwd(print working directory)用于输出当前工作目录的绝对路径。...常用参数: p: 用于构建复杂的目录层次结构,不论父目录是否已经存在 touch touch 用于更改文件访问和修改时间的标准 Unix 程序,它也被用于创建新文件。...屏幕上的错误输出,文件描述符为 2 相关符号 ‘重定向 ‘>’ : 标准输出重定向 ‘2>’ : 标准错误重定向 ‘>>’ : 标准输出追加 ‘2>>’: 标准错误追加 ‘&>’ :

    52020
    领券