小编dim*_*414的帖子

除非非零退出代码,否则禁止输出

除非程序以非零代码退出,否则抑制输出(stdout 和 stderr)的最佳方法是什么?我在想:

quiet_success()
{
  file=$(mktemp)
  if ! "$@" > "$file" 2>&1; then
    cat "$file"
  fi
  rm -f "$file"
}
Run Code Online (Sandbox Code Playgroud)

并运行,quiet_success my_long_noisy_script.sh但我不确定是否有更好的方法。我觉得这必须是其他人需要做的事情。

对于上下文,我希望将其添加到我的 cron 脚本中,以便在失败时通过电子邮件发送所有内容,但如果失败则不会。

cron io-redirection shell-script

19
推荐指数
2
解决办法
5835
查看次数

tput 选项的完整列表

我想隐藏光标,我知道tput命令。我确实搜索了它的手册页。在网上搜索,我发现

$ tput civis  # to hide the cursor
$ tput cnorm  # to bring back the cursor
Run Code Online (Sandbox Code Playgroud)

这些工作完美,但这些选项在手册页的任何地方都没有提到。

他们在哪里正式记录?

man documentation tput

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

为什么我不应该使用 'kill -9' / SIGKILL

发布这个问题是因为我很惊讶没有直接回答它;如果这是重复的,请道歉 - 我确实看过!

我听说过kill -9或者kill -SIGKILL不好,但我不明白为什么。如果我不应该kill -9有什么我做杀死一个进程?

process kill

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

在旨在交互使用的函数中显示使用注释

我在 my 中定义了许多函数.bashrc,旨在在终端中交互使用。我通常在它们之前添加一条描述其预期用途的评论:

# Usage: foo [bar]
# Foo's a bar into a baz
foo() {
  ...
}
Run Code Online (Sandbox Code Playgroud)

如果浏览源代码,这很好,但是type在终端中运行以快速提醒该函数的作用是很好的。然而,这(可以理解)不包括评论:

$ type foo
foo is a function
foo ()
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

这让我想到“如果这种评论持续存在以便type可以显示它们,那不是很好吗?” 本着 Python文档字符串的精神,我想出了这个:

foo() {
  : Usage: foo [bar]
  : "Foo's a bar into a baz"
  ...
}

$ type foo
foo is a function
foo ()
{
    : Usage: foo [bar];
    : "Foo's a bar into a baz";
    ...
} …
Run Code Online (Sandbox Code Playgroud)

bash function interactive

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

Grep 不匹配回车符

我试图找到带有回车符的行,但我没有得到我期望的结果。我已经将其缩减为这个概念验证:

$ uname -a
CYGWIN_NT-6.1 Aodh 2.0.4(0.287/5/3) 2015-06-09 12:22 x86_64 Cygwin

$ grep --version
grep (GNU grep) 2.21
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and others, see <http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.

$ od -c cr_poc.txt
0000000   h   e   l   l   o       w   o   r   l …
Run Code Online (Sandbox Code Playgroud)

grep cygwin newlines

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

代表用户电子邮件地址的规范环境变量

我正在编写一个 Bash 函数,该函数将在完成后向当前用户发送一封电子邮件。我想知道是否有规范或正常的方法来获取用户的电子邮件地址。我当前的计划是简单地使用$EMAIL,这肯定会工作得足够好,但我不确定是否有更好或“正确”的方式来引用当前用户的电子邮件地址(当然,假设它已设置)。

请注意,我并不是尝试发送计算机的本地邮件,而是发送远程地址。

shell bash email

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

运行 ps 时是否有竞争条件的风险?

我正在开始一个长时间运行的过程(在 Java 中,在相关的偶然情况下),然后想通过ps. 我基本上是这样做的:

Process longRunningProcess = new ProcessBuilder(...).start();

Process psProcess = new ProcessBuilder("ps").start();
psProcess.waitFor();
// extract the PID from the output of psProcess
Run Code Online (Sandbox Code Playgroud)

或者等效地在 Bash 中:

$ long_running_process > /dev/null & ps
Run Code Online (Sandbox Code Playgroud)

问题是,长期运行的过程是否可能处于某种ps尚未报告的仍在启动状态?或者是否有任何保证在ps执行时,长时间运行的进程将启动到足以可见?重复运行命令似乎总是包含该过程,但这显然不能证明任何事情。

这篇文章警告说,在启动之后 ps启动的命令可能存在竞争条件(例如ps | grep),但没有提到任何关于在 之前启动的进程ps

ps background-process

5
推荐指数
0
解决办法
563
查看次数

设置终端的“图标标题”是什么意思?

我通常看到将终端标题设置为(类似)的语法:

echo -e '\e]0;Some Title\a'
Run Code Online (Sandbox Code Playgroud)

但是我注意到这个答案使用了2而不是0,这促使我做更多的挖掘。根据此文档,您实际上可以使用以下语法设置“图标名称”和“窗口标题”:

·  ESC]0;stringBEL -- Set icon name and window title to string

·  ESC]1;stringBEL -- Set icon name to string

·  ESC]2;stringBEL -- Set window title to string

   where ESC is the escape character (\033), and BEL is the bell
   character (\007).

Printing one of these sequences within the xterm will cause the window
or icon title to be changed.
Run Code Online (Sandbox Code Playgroud)

但它没有继续解释“图标标题”或“图标名称”的确切含义。当我尝试,我看不出有什么区别02,并1没有 …

xterm x11 window-title

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

从右移 bash 参数

我有一个脚本,用户将为其添加前缀而不是附加参数,即他们可能会调用command Ccommand B Ccommand A B C等。

我希望能够简单地从右侧移动这些参数,就像使用shift.

我正在成像一个shift-right行为如下的命令:

echo "$@"    # A B C
shift-right
echo "$@"    # A B
shift-right
echo "$@"    # A
shift-right
echo "$@"    # 
echo "$#"    # 0
Run Code Online (Sandbox Code Playgroud)

有没有一种干净的方法来实现这一点?我知道我可以解决它,但类似shift的解决方案会更好更简单。


作为对 XY 问题评论的回应,我的特定用例是一个命令,它接受一个端口或一个主机和端口,例如command 123command remotehost 123。我不希望用户必须以相反的顺序指定这些(端口然后是主机)。

说这样的话(显然未经测试)会相当干净:

port=${@: -1}
shift-right
host=${1:-localhost}
Run Code Online (Sandbox Code Playgroud)

真的,我对这个问题很好奇,即使有更好的方法来解决这个特定的例子。

这是一种相当干净的方法来处理没有 的两个参数的情况shift-right,仅供参考:

port=${@: -1}
host=${2:+$1}
host=${host:-localhost}
Run Code Online (Sandbox Code Playgroud)

但希望你能理解随着参数数量的增加,它变得更加笨拙。

bash

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

当我跳出循环时触发非零退出代码

我想运行一系列任务,但如果其中任何一个失败就停止,因此我写了(类似):

for task in [TASKS]; do
  process "$task" || break
  commit "$task"
done
Run Code Online (Sandbox Code Playgroud)

这工作正常,但是(如指定的那样)即使我们提前中断,此循环的退出状态也为零。理想情况下break-ing 将能够传达失败。

我知道返回0是 的记录行为break,但我很好奇是否有任何相对干净的解决方法。我能想象的最好的方法是将它包装在一个函数中并设置一个didBreak变量,并将其用作(函数的)退出状态。它可以工作,但感觉过于复杂。

bash exit-status

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