跑步
bash -c 'bash -c "echo test1; exit 1;" &> /tmp/x; buildresult=$?; tail -n 100 /tmp/x; exit $buildresult;'
Run Code Online (Sandbox Code Playgroud)
结果test1
被打印到控制台并echo $?
打印1
在我的理解中是正确的,因为命令应该返回内部[b/d]ash -c
返回的内容,而
dash -c 'dash -c "echo test1; exit 1;" &> /tmp/x; buildresult=$?; tail -n 100 /tmp/x; exit $buildresult;'
Run Code Online (Sandbox Code Playgroud)
导致相同的输出,但0
根据返回echo $?
。
我想了解这种差异,以拓宽我对 shell 和可移植 shell 编程的理解。
我在 Ubuntu 17.10 (Artful Aardvark) 上使用bash
4.4.12 和dash
0.5.8-2.3ubuntu1。
在 sh 脚本中,另一个 sh 脚本以su -l <user> -c /path/to/script.sh
. 据我了解script.sh
将在非交互式 shell 中运行。官方文档试图解释如何在这种非交互式 shell 中设置变量,即在BASH_ENV
[ http://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html ] 中传递它们。对于初学者来说,这显然是一个不充分的解释,并且没有(真实的)示例(在 $SEARCH_ENGINE 中也没有找到)。
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
Run Code Online (Sandbox Code Playgroud)
可能意味着很多 [1]。有人可以举一个传递给非交互式 shell 的环境变量的例子。
只是为了确保:登录和非登录以及交互式和非交互式之间的区别对我来说很清楚(https://superuser.com/questions/636219/where-should-i-export-an-environment- variable-so-that-all-combinations-of-bash-d或引用链接(如果有人感兴趣)。
[1]我试过了
BASH_ENV="\\$PATH=$PATH\\n\\$JAVA_HOME=$JAVA_HOME" su -l artifactory -c echo $JAVA_HOME
BASH_ENV="\$PATH=$PATH\n\$JAVA_HOME=$JAVA_HOME" su -l artifactory -c echo $JAVA_HOME
su -l artifactory -c echo $JAVA_HOME
当我调用一个长时间运行的命令时,例如du
,我没有找到中止/取消它的方法(Strg/Ctrl+c不起作用),其他 shell/tty 不可用。在启动了一个长时间运行的命令后,我是否就彻底完蛋了?
第一行说 shell 是ash
v1.22.1 BusyBox
(当然ash
不提供-V/--version
选项)。
我想为内核模块添加一个别名,例如在带有 Linux 3.18.1 的 Ubuntu 14.10 上nvidia-343
可用nvidia
,以便它可以在别名下加载,并且别名出现在modinfo
.
一个什么样的内核模块别名的解释目前的水平是在联机帮助页modprobe
,modinfo
,modinfo
,等是相当可笑的,因为它是零(见https://bugs.launchpad.net/ubuntu/+source/kmod/+bug/ 1405669也是如此)。
如http://www.tldp.org/LDP/lkmpg/2.6/html/x44.html所述,alias <name> <alias>
以 to的形式添加一行不起作用(输出中未列出别名)(我猜(!)这些无论如何都是 2.6.x 的文档)。/etc/modprobe.conf
modinfo
我只是偶然发现
exec 1> >(logger -s -t $(basename $0)) 2>&1
Run Code Online (Sandbox Code Playgroud)
它用于将当前脚本的输出重定向到系统记录器(如果您从未见过这个,但有兴趣查看/sf/ask/622177601/命令来拓宽您的 shell 知识)。
我想知道为什么这1>
是必要的。这似乎是必要的,因为exec >(logger -s -t test) 2>&1
失败的原因是
bash: /dev/fd/63: Permission denied
bash: exec: /dev/fd/63: cannot execute: Permission denied
Run Code Online (Sandbox Code Playgroud)
然而,省略1>
是我凭直觉所做的,因为exec >[some redirection target]
根据上面链接的问题已经足以进行重定向。2>&1
然后像平常一样将 stderr 重定向到 stdout。
我正在使用 bash 4.4.19。
我发现
[ ! -f /etc/default/lxc-net ] || . /etc/default/lxc-net
Run Code Online (Sandbox Code Playgroud)
在/etc/default/lxc
Ubuntu 16.04 上,它似乎正在替换(我自己的或包维护者代码)
[ -f /etc/default/lxc-net ] && . /etc/default/lxc-net
Run Code Online (Sandbox Code Playgroud)
由于测试是违反直觉的(如果关于文件不存在的测试失败,请运行命令)我想知道它是否比&&
-version有任何优势。
我正在从一个大型二进制文件(1 TB)中提取一个十六进制模式(当前是一个数字)
xxd -p /path/to/sda.img | tr -d '\n' | grep -ob '117a0cb17ada1002'
Run Code Online (Sandbox Code Playgroud)
我想知道为什么grep
最多使用 7 GB RAM 然后崩溃并显示没有更多 RAM 可用的错误消息(我有更多(16 GB + 8 GB 交换),但我收到了消息)。我的问题是
grep
如果不需要记住任何东西,为什么要使用这么多内存(搜索结果立即打印到标准输出(没有输出,所以我假设没有搜索结果,在较小的文件上搜索结果已显示)立即地)?grep
替代(一组)命令来完成相同的任务,我怎么能防止这种内存使用?我删除\n
以获得正确的字节偏移量。我想知道文件中的位置/没有分隔符的一行没有大量计算(减去插入的换行符等)。
我grep
在 Ubuntu 14.10 amd64 上运行2.20-3。
这不是一个严重的问题,因为它可以通过重新启动来修复,但我很好奇是否有办法恢复 、和中的文件(可能不是全部/proc
,但尽可能多)。/sys
/dev/pts
/dev
chroot
当删除安装有这些目录的目录时,我部分删除了它们
mount -t proc proc [path/to/chroot]/proc
mount -t sysfs sys [path/to/chroot]/sys
mount --bind /dev/[path/to/chroot]/dev
mount -t devpts /dev/path [path/to/chroot]/dev/pts
Run Code Online (Sandbox Code Playgroud)
在 Ubuntu 16.10 amd64 上。某些文件的删除失败(我没有记录错误消息),因为文件删除被拒绝,这是我可以理解的。我想该解决方案将适用于所有基于 Debian 的系统。
退出后chroot
我看到类似的事情
$ ls -bash: /dev/null: Keine Berechtigung
bash: _upvars: `-a2': invalid number specifier
-bash: /dev/null: Keine Berechtigung
bash: _upvars: `-a0': invalid number specifier
Run Code Online (Sandbox Code Playgroud)
在使用Tabon自动完成期间ls
(导出后LANGUAGE=en
)。
我一直reportbug
在 Debian 9 上以新手模式使用,需要取消报告,因为没有安装编辑器(在 Docker 映像上)。
最后一次互动是
提交有关 postgresql 的报告(e 进行编辑)[y|n|a|c|E|i|l|m|p|q|d|t|s|?]?n 将报告的备份保存在 /tmp/reportbug-postgresql-backup-20180226-11446-cwjfs5eu 错误报告编写为 /tmp/reportbug-postgresql-20180226-11446-mrfjtcvz
现在,我似乎找不到根据输出再次打开草稿的方法reportbug --help
(draftpath
似乎仅用于存储新草稿):
用法:reportbug [选项] 选项: --version 显示程序的版本号并退出 -h, --help 显示此帮助消息并退出 -c, --无配置文件 报告中不包含配置文件 -C 类,--class=类 指定 GNATS BTS 的报告类别 -d, --debug 仅向您自己发送报告 --test 在测试模式下运行(仅限维护人员使用) -e 编辑器, --editor=编辑器 为您的报告指定编辑者 -f 搜索, --文件名=搜索 报告包含以下内容的包的错误 指定文件 --from-buildd=BUILDD_FORMAT 从构建格式解析信息:$source_$version --path 只搜索带-f的路径 -g, --gnupg, --gpg 使用 GNU Privacy Guard (GnuPG/gpg) 签署报告 -G, --gnus 使用 Gnus 发送报告 --pgp 使用 Pretty Good Privacy (PGP) 签署报告 -K …
我怀疑进程在分别用SIGINT
和杀死时不发送 EOF SIGKILL
。可能是这种情况吗(或者所有进程是否总是在被任何信号终止后发送 EOF)stdout
?stderr
如果是,我如何模仿这样的过程,以便我可以在 Java 单元测试中使用它(仅需要在 Linux 上运行初学者)?
英文维基百科的 EOF 文章对此并不清楚,德国人说 EOF“可能”被发送。
我知道这可能是一个 XY 问题,并且在调试 Java 代码时寻求支持可以更快地修复问题,但我也有兴趣获得这个问题的答案。我还知道 Java 9 中的进程处理得到了改进,但我还无法使用。
我正在使用 Ubuntu 17.04 和 Linux 4.10。
该命令sudo dd if=/dev/sdb | pigz -c | sudo tee /sdb.img.gz
(sudo
标题中省略)将二进制数据打印到控制台dd
或pigz
。我想知道为什么因为所有输出都被捕获在一个管道中|
并且链中的最后一个被重定向到文件。因此,标准输出没有“泄漏”。我没有得到什么?
我在bash
Ubuntu 20.04 上使用命令的附带版本。