除非程序以非零代码退出,否则抑制输出(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 脚本中,以便在失败时通过电子邮件发送所有内容,但如果失败则不会。
我想隐藏光标,我知道tput
命令。我确实搜索了它的手册页。在网上搜索,我发现
$ tput civis # to hide the cursor
$ tput cnorm # to bring back the cursor
Run Code Online (Sandbox Code Playgroud)
这些工作完美,但这些选项在手册页的任何地方都没有提到。
他们在哪里正式记录?
发布这个问题是因为我很惊讶没有直接回答它;如果这是重复的,请道歉 - 我确实看过!
我听说过kill -9
或者kill -SIGKILL
不好,但我不明白为什么。如果我不应该kill -9
有什么要我做杀死一个进程?
我在 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) 我试图找到带有回车符的行,但我没有得到我期望的结果。我已经将其缩减为这个概念验证:
$ 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) 我正在编写一个 Bash 函数,该函数将在完成后向当前用户发送一封电子邮件。我想知道是否有规范或正常的方法来获取用户的电子邮件地址。我当前的计划是简单地使用$EMAIL
,这肯定会工作得足够好,但我不确定是否有更好或“正确”的方式来引用当前用户的电子邮件地址(当然,假设它已设置)。
请注意,我并不是尝试发送计算机的本地邮件,而是发送远程地址。
我正在开始一个长时间运行的过程(在 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
。
我通常看到将终端标题设置为(类似)的语法:
echo -e '\e]0;Some Title\a'
Run Code Online (Sandbox Code Playgroud)
但是我注意到这个答案使用了2
而不是0
,这促使我做更多的挖掘。根据此文档,您实际上可以使用以下语法设置“图标名称”和“窗口标题”:
Run Code Online (Sandbox Code Playgroud)· 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.
但它没有继续解释“图标标题”或“图标名称”的确切含义。当我尝试,我看不出有什么区别0
和2
,并1
没有 …
我有一个脚本,用户将为其添加前缀而不是附加参数,即他们可能会调用command C
、command B C
、command 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 123
或command 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)
但希望你能理解随着参数数量的增加,它变得更加笨拙。
我想运行一系列任务,但如果其中任何一个失败就停止,因此我写了(类似):
for task in [TASKS]; do
process "$task" || break
commit "$task"
done
Run Code Online (Sandbox Code Playgroud)
这工作正常,但是(如指定的那样)即使我们提前中断,此循环的退出状态也为零。理想情况下break
-ing 将能够传达失败。
我知道返回0
是 的记录行为break
,但我很好奇是否有任何相对干净的解决方法。我能想象的最好的方法是将它包装在一个函数中并设置一个didBreak
变量,并将其用作(函数的)退出状态。它可以工作,但感觉过于复杂。
bash ×4
cron ×1
cygwin ×1
email ×1
exit-status ×1
function ×1
grep ×1
interactive ×1
kill ×1
man ×1
newlines ×1
process ×1
ps ×1
shell ×1
shell-script ×1
tput ×1
window-title ×1
x11 ×1
xterm ×1