昨天我读了这个 SO 评论,它说在 shell 中(至少bash)>&-“与”具有相同的结果>/dev/null。
该评论实际上将 ABS 指南称为其信息来源。但该消息来源说>&-语法“关闭文件描述符”。
我不清楚关闭文件描述符和将其重定向到空设备这两个操作是否完全等效。所以我的问题是:是吗?
从表面上看,关闭描述符就像关闭一扇门,但将其重定向到空设备似乎打开了一扇通往地狱的大门!两者对我来说似乎并不完全相同,因为如果我看到一扇关着的门,我不会尝试从里面扔出任何东西,但是如果我看到一扇敞开的门,我会认为我可以。
换句话说,我一直想知道是否>/dev/null意味着cat mybigfile >/dev/null实际上会处理文件的每个字节并将其写入/dev/null忘记它。另一方面,如果 shell 遇到一个关闭的文件描述符,我倾向于认为(但我不确定)它不会写任何东西,尽管问题仍然是是否cat仍会读取每个字节。
这个评论说>&-和>/dev/null“应该”是一样的,但对我来说并不是那么响亮的答案。我想有一个更权威的答案,参考标准或源核心与否......
我记得曾在某处看到一个bash脚本使用case并shift遍历位置参数列表,当遇到参数时解析标志和带有参数的选项,并在解析后删除它们以只留下裸参数,稍后由其余部分处理脚本。
例如,在解析 的命令行时cp -R file1 -t /mybackup file2 -f,首先遍历参数,识别用户请求下降到目录 by -R,指定目标 by-t /mybackup并强制复制 by -f,然后将这些从参数列表中删除,留下file1 file2作为剩余参数处理的程序。
但我似乎无法记住/找出我看到的任何脚本。我只是希望能够做到这一点。我一直在谷歌搜索各种网站,并附上我检查过的相关页面列表。
本网站上的一个问题专门询问了“与顺序无关的选项”,但单一答案和被重复的问题的答案都没有考虑上述选项与正常参数混合的情况,我认为这是该人特别提及与订单无关的选项的原因。
由于bash的内置getopts似乎在第一个非选项参数处停止,因此它似乎不足以作为解决方案。这就是 Wooledge BashFAQ 的页面(见下文)解释如何重新排列参数的原因。但我想避免创建多个数组,以防参数列表很长。
由于shift不支持从参数列表的中间弹出单个参数,我不确定实现我所要求的直接方法是什么。
我想听听是否有人有任何解决方案来从参数列表的中间删除参数而不创建一个全新的数组。
我已经看过的页面:
为什么以下基本脚本的 shebang 部分不起作用:
$ cat hello.sh
#! /bin/sh
echo Hello
$ ./hello.sh
bash: ./hello.sh: /bin/sh^M: bad interpreter: No such file or directory
$ cat hello.py
#! /usr/bin/env python3
print("Hello")
$ ./hello.py
: No such file or directory
Run Code Online (Sandbox Code Playgroud)
而手动调用解释器正在工作:
$ sh hello.sh
Hello
$ python3 hello.py
Hello
Run Code Online (Sandbox Code Playgroud) bash在 Kubuntu Trusty 64 位上运行4.3。请看以下两个文件:
捕获-int.sh
#! /bin/bash
trap "echo Exiting" INT
cat </dev/urandom >/dev/null
echo Hello
Run Code Online (Sandbox Code Playgroud)
诱捕exit.sh
#! /bin/bash
trap "echo Exiting" EXIT
cat </dev/urandom >/dev/null
echo Hello
Run Code Online (Sandbox Code Playgroud)
现在,在点击 ^C 时,捕获 SIGINT 会同时打印两者Exiting,Hello而捕获 EXITExiting只会打印但带有额外的换行符:
$ ./trapping-int
^CExiting
Hello
$ ./trapping-exit
^CExiting
$
Run Code Online (Sandbox Code Playgroud)
我想知道不同行为的原因。另外,我可以安全地假设即使 INT 是由 ^C 给出的,也总是会调用 EXIT 吗?
注释掉两个脚本中的最后一行会导致捕获 SIGINT 不再打印 Hello,但捕获 EXIT 仍会打印额外的换行符。我也想知道这里的原因。
谢谢!
我正在做类似于以下最小示例的操作:
#! /bin/sh
# $1 = file containing list of files to sync
# $2 = source dir ; $3 = target dir
cat "$1" | while read f
do
cp -i "$2"/"$f" "$3"/"$f"
done
Run Code Online (Sandbox Code Playgroud)
我发现它cp -i根本不等待我的输入,循环只会运行到最后。为什么,以及可以做些什么来解决这种情况?