最初发布到 AskUbuntu.com ...
AskUbuntu 采用了关闭有关 EOL(生命周期结束)版本问题的策略。还有一个声音队伍来删除它们。为了防止可能丢失这个热门问题(迄今为止有 342335 次浏览),我在此处放置了一个修订版。--- 文档打捞者
“经典”系统...
GRUB 2将许多*.mod
文件(内核模块)放在/boot/grub
. 删除这些文件(认为它们是放错位置的声音文件)导致重新启动失败并提示grub rescue>
.
在这种情况下如何恢复?
(以前的标题 - bash:在后台运行命令并捕获 pid)
注意这不是另一个问题的 [DUPLICATE],因为它解决了 bash 的意外行为,其中子
$!
进程启动失败,比如由于“找不到命令”,可以将设置保留为调用进程的 pid 而不是失败子进程的 pid 或 "" (null)。-- 文档打捞者
我正在编写 bash 4.1 脚本...
如果后台工作总是开始,那么这些工作中的任何一个都可以工作......
cmd &
VAR=$!
or...
( cmd & ); VAR=$!
Run Code Online (Sandbox Code Playgroud)
如果cmd
运行,最后启动的命令的 pid ($!) 将是我们想要的,而 $VAR 将是正确的。
但是,如果cmd
没有启动,$VAR 将是启动之前的最后一个命令的 pid,这可能是前台脚本本身的 pid。由于我需要 pidcmd
以便稍后在某些条件下终止进程,因此可能无法获得错误的 pid。
我真正需要的是只有在后台作业运行时才更改 VAR。像语法不正确的东西......
VAR=
( cmd & ); && VAR=$!
Run Code Online (Sandbox Code Playgroud)
评论和 Joseph R 的回答非常有帮助。为了任何有类似问题的人的利益......
以下 bash 函数standby
在后台运行 GtkDialog脚本。在一个本身在子进程中运行的函数内部,似乎提供了隔离我需要避免获取调用脚本的 PID 而不是脚本的 PIDstandby …
坚持使用 GNU awk 3.1.6 并认为我已经解决了它的数组错误,但在 600 行 awk 程序中仍然存在范围问题。需要验证对 awk 中数组范围的理解才能找到我的错误。
鉴于这个说明性的 awk 代码......
function foo(ga) {
ga[1] = "global result"
}
garray[1] = "global"
foo(garray)
print garray[1]
Run Code Online (Sandbox Code Playgroud)
将打印...
global result
Run Code Online (Sandbox Code Playgroud)
由于数组总是通过引用传递给函数,因此所有数组总是全局的。无法创建本地数组。这样对吗?一直无法找到明确说明这一点的文档。
由于我正在调试,并且 3.1.6 本身在这方面有已知的错误,我试图确定 awk 的错误从哪里停止,我的错误从哪里开始。
补充:为什么 ga[] 在函数内部工作呢?
首先,将数组传递给函数 withfoo(ga)
实际上是不必要的。只需garray[]
在函数内部访问它。然而,这样做并没有可衡量的性能损失,它有助于调试和错误报告。
在使用中foo(ga)
,ga[]
是全局数组的同义词garray[]
。它不是 的本地副本garray[]
,而是简单的指向 的指针garray[]
,就像符号链接是指向文件的指针一样,因此可以使用多个名称访问同一个文件(或数组)。
补充:澄清格伦杰克曼的回答
虽然在函数外部创建的数组对函数来说是全局的,并且可以传递给它或只是在函数内部被引用,但在函数内部创建的数组确实对函数保持局部并且在函数外部不可见。修改杰克曼先生的例子说明了这一点......
awk '
function bar(x,y) {
split("hello world", y)
print "x[1] inside: …
Run Code Online (Sandbox Code Playgroud) 处理 bash 函数调用堆栈跟踪...
脚本捕获错误并运行callStack()
函数。但是在捕获时,它总是显示callStack()
函数本身的调用堆栈,而不是发生陷阱的函数,如...
/share/sbin/zimdialog: line 647: status: command not found
Function call stack ( command.function() ) ...
/share/sbin/zimdialog.main()
/share/sbin/include.callStack()
Run Code Online (Sandbox Code Playgroud)
希望获得包含errantFunction()
类似内容的堆栈跟踪...
/share/sbin/zimdialog: line 647: status: command not found
Function call stack ( command.function() ) ...
/share/sbin/zimdialog.main()
/share/sbin/zimdialog.errantFunction()
/share/sbin/include.callStack()
Run Code Online (Sandbox Code Playgroud)
陷阱被编码为...
trap callStack HUP INT QUIT TERM ERR
Run Code Online (Sandbox Code Playgroud)
该callStack()
函数被编码为...
function callStack () {
{ isNotNull "$1" && isHelp "$1"; } && {
helpShow 'callStack
Diagnostics regarding where the call to this function came from' …
Run Code Online (Sandbox Code Playgroud) 我正在使用一个很长的gawk 3.1.6脚本来将 Zim markdown 文本复杂地转换为 GtkDialog 代码,并且遇到了以下问题......
示例 ASCII 输入...
[[link|label label]] [[link]] @tag more text
Run Code Online (Sandbox Code Playgroud)
命令行测试以找到正确的正则表达式...
re="[][][][]"; echo '[[link|label label]] [[link]] @tag more text' | awk -v RE=$re '{split($0,A,RE); printf "\n(" A[1] ")(" A[2] ")(" A[3] ")(" A[4] ")(" A[5] ")(" A[6] ")(" A[7] ")(" A[8] ")\n"}'
Run Code Online (Sandbox Code Playgroud)
正则表达式"[][][][]"
很好地分离了两个超链接形式,所以这不是问题。
如果我们能把它分成两部分会更容易理解——
"[][]"
和"[][]"
。我们正在寻找要拆分的“[[”或“]]”。类中字符的顺序必须颠倒以符合类元字符限制。
问题还在于将“@tag”拆分为“tag”。“标签”可以是任何字母数字文本,后跟空格或字符串结尾。
执行上面的命令行测试会产生......
()(link|label label)( )(link)( @tag more text)()()
Run Code Online (Sandbox Code Playgroud)
但我需要它来屈服......
()(link|label label)( )(link)( )(tag)(more text)
Run Code Online (Sandbox Code Playgroud)
我尝试了许多正则表达式字符串,例如"[][][][]|@[[:alnum:]]*"
删除整个单词并产生......
()(link|label label)( )(link)( )( more …
Run Code Online (Sandbox Code Playgroud) 尽管 Unix/Linux 在技术上允许文件和目录名称中的任何字符,但由于 O/S 广泛使用标点符号作为分隔符等,使用标点符号几乎总是充满危险。
也就是说,我正在尝试一些可以从只命名单个字符@
(at 符号)的目录中受益的东西 。
我使用了几天没有遇到任何问题,但可能忽略了一些问题。
是否有命令或情况可以让这再次咬我?