gpt4 book ai didi

linux - `exec n<&0 < file` 和 `exec n
转载 作者:塔克拉玛干 更新时间:2023-11-02 23:53:21 27 4
gpt4 key购买 nike

因为我是 shell 脚本的新手,exec命令总是让我感到困惑,同时用 while 探索这个话题循环触发了以下 4 个问题:

  1. 下面的语法 1 和 2 有什么区别

    语法 1:

    while read LINE
    do
    : # manipulate file here
    done < file

    语法 2:

    exec n<&0 < file
    while read LINE
    do
    : # manipulate file here
    done
    exec 0<&n n<&-
  2. 请详细说明exec n<&0 < file的操作清醒地

  3. 这是exec n<&0 < file吗?命令相当于 exec n<file ? (如果不是那么两者有什么区别?)

  4. 我在Bourne shell 和旧版本的 ksh 中读过一些内容,while 有问题循环是在子shell中执行。这意味着对脚本环境的任何更改,例如导出变量和更改当前工作目录,可能不会在 while 之后出现。循环完成。例如,考虑以下脚本:

    #!/bin/sh
    if [ -f “$1” ] ; then
    i=0
    while read LINE
    do
    i=`expr $i + 1`
    done < “$1”
    echo $i
    fi

此脚本尝试计算作为参数指定给它的文件中的行数。

在文件上执行这个脚本

$ cat dirs.txt
/tmp
/usr/local
/opt/bin
/var

会产生以下不正确的结果:0

尽管您使用命令递增 $i 的值我= expr $i + 1当 while 循环完成时,$i 的值不会被保留。

在这种情况下,您需要更改 while 中的变量值循环,然后在循环外使用该值。

解决此问题的一种方法是在进入循环之前重定向 STDIN,然后在循环完成后恢复 STDIN。

基本语法是

exec n<&0 < file
while read LINE
do
: # manipulate file here
done
exec 0<&n n<&-

我的问题是:

Bourne shell 和旧版本的 ksh 中,ALTHOUGH WHILE循环在 SUBSHELL 中执行,这是怎么回事 exec即使在 while 之后,这里的命令也有助于保留变量值循环完成即这里如何 exec命令完成任务 更改 while 中的变量值循环,然后在循环外使用该值。

最佳答案

  1. 在现代 shell 中应该没什么区别(两者都应该是 POSIX compatible ),但有一些注意事项:
    • 可能有数以千计的独特 shell 二进制文件在使用中,其中一些缺少常见功能或存在错误。
    • 只有第一个版本在交互式 shell 中会按预期运行,因为一旦标准输入收到 EOF,shell 就会关闭,这将在它完成读取 file 后发生。 .
    • while在这两种情况下循环都从 FD 0 读取,使得 exec如果 shell 支持 < 则毫无意义重定向到 while循环。要从 FD 9 读取你必须使用 done <&9 (POSIX) 或 read -u 9 (在 Bash 中)。
  2. exec (在这种情况下,请参阅 help exec/man exec )应用 redirections跟随它到当前 shell,它们从左到右应用。例如,exec 9<&0 < file将 FD 9 指向 FD 0(标准输入)当前指向的位置,有效地使 FD 9 成为 FD 0 的“副本”。之后 file被发送到标准输入(FD 0 和 9)。
  3. 在 shell 中运行 shell 以查看两者之间的区别(注释解释):

    $ echo foo > file
    $ exec "$SHELL"
    $ exec 9<&0 < file
    $ foo # The contents of the file is executed in the shell
    bash: foo: command not found
    $ exit # Because the end of file, equivalent to pressing Ctrl-d
    $ exec "$SHELL"
    $ exec 9< file # Nothing happens, simply sends file to FD 9
  4. 这是对 *nix shell 的常见误解: Variables declared in subshells (such as created by while ) are not available to the parent shell. 这是设计使然,不是错误。这里和 USE 上的许多其他答案引用这个。

关于linux - `exec n<&0 < file` 和 `exec n<file` 命令之间的区别以及有关 exec 命令的一些一般问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25535605/

27 4 0

Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com