小编Kar*_*ter的帖子

为什么使用嵌套命令的存储返回码退出会导致 Dash 和 Bash 中的返回码不同?

跑步

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) 上使用bash4.4.12 和dash0.5.8-2.3ubuntu1。

shell bash dash subshell exit-status

8
推荐指数
1
解决办法
486
查看次数

如何将环境变量传递给非交互式 shell(示例)?

在 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

scripting bash environment-variables

6
推荐指数
1
解决办法
2万
查看次数

如何中止/取消 initramfs 中正在运行的命令?

当我调用一个长时间运行的命令时,例如du,我没有找到中止/取消它的方法(Strg/Ctrl+c不起作用),其他 shell/tty 不可用。在启动了一个长时间运行的命令后,我是否就彻底完蛋了?

第一行说 shell 是ashv1.22.1 BusyBox(当然ash不提供-V/--version选项)。

command-line initramfs

6
推荐指数
0
解决办法
577
查看次数

如何为内核模块添加别名?

我想为内核模块添加一个别名,例如在带有 Linux 3.18.1 的 Ubuntu 14.10 上nvidia-343可用nvidia,以便它可以在别名下加载,并且别名出现在modinfo.

一个什么样的内核模块别名的解释目前的水平是在联机帮助页modprobemodinfomodinfo,等是相当可笑的,因为它是零(见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.confmodinfo

linux kernel-modules

5
推荐指数
1
解决办法
1万
查看次数

exec 1&gt; &gt;(logger -s -t tagname) 2&gt;&amp;1 中 1&gt; 的用途是什么?

我只是偶然发现

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。

shell bash io-redirection exec

5
推荐指数
1
解决办法
1747
查看次数

是否有理由使用“[ ! -f file ] || command”而不是“[ -f file ] &amp;&amp; command”?

我发现

[ ! -f /etc/default/lxc-net ] || . /etc/default/lxc-net
Run Code Online (Sandbox Code Playgroud)

/etc/default/lxcUbuntu 16.04 上,它似乎正在替换(我自己的或包维护者代码)

[ -f /etc/default/lxc-net ] && . /etc/default/lxc-net
Run Code Online (Sandbox Code Playgroud)

由于测试是违反直觉的(如果关于文件不存在的测试失败,请运行命令)我想知道它是否比&&-version有任何优势。

bash shell-script

4
推荐指数
1
解决办法
106
查看次数

如何防止 grep 过度使用不必要的内存

我正在从一个大型二进制文件(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。

linux grep

2
推荐指数
1
解决办法
3832
查看次数

从 rm -rf /proc /sys/ /dev/pts /dev 恢复而不重新启动?

这不是一个严重的问题,因为它可以通过重新启动来修复,但我很好奇是否有办法恢复 、和中的文件(可能不是全部/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)。

linux mount devices proc sysfs

2
推荐指数
1
解决办法
2958
查看次数

之前取消举报后如何在reportbug中打开草稿?

我一直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 --helpdraftpath似乎仅用于存储新草稿):

用法: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 …

debian bugs reportbug

2
推荐指数
1
解决办法
309
查看次数

是否有一个进程在终止前不发送 EOF 以及如何创建它?

我怀疑进程在分别用SIGINT和杀死时不发送 EOF SIGKILL。可能是这种情况吗(或者所有进程是否总是在被任何信号终止后发送 EOF)stdoutstderr如果是,我如何模仿这样的过程,以便我可以在 Java 单元测试中使用它(仅需要在 Linux 上运行初学者)?

英文维基百科的 EOF 文章对此并不清楚,德国人说 EOF“可能”被发送。

我知道这可能是一个 XY 问题,并且在调试 Java 代码时寻求支持可以更快地修复问题,但我也有兴趣获得这个问题的答案。我还知道 Java 9 中的进程处理得到了改进,但我还无法使用。

我正在使用 Ubuntu 17.04 和 Linux 4.10。

linux process stdout stderr

1
推荐指数
1
解决办法
1039
查看次数

为什么 dd if=/dev/sdb | 猪-c | tee /sdb.img.gz 打印到控制台?

该命令sudo dd if=/dev/sdb | pigz -c | sudo tee /sdb.img.gzsudo标题中省略)将二进制数据打印到控制台ddpigz。我想知道为什么因为所有输出都被捕获在一个管道中|并且链中的最后一个被重定向到文件。因此,标准输出没有“泄漏”。我没有得到什么?

我在bashUbuntu 20.04 上使用命令的附带版本。

bash pipe dd tee

0
推荐指数
1
解决办法
116
查看次数