为什么ksh
history -0
(最后一个命令,即历史命令本身)有效,但却zsh
失败了(仅history -1
在我的 zsh 上有效)。我尝试zsh -f
使用默认选项,但仍然失败。
我Version AJM 93u+ 2012-08-01
在 MacOS 上使用 ksh 版本和 Zsh v5.9。
为什么ksh
history -0
(最后一个命令,即历史命令本身)有效,但却zsh
失败了(仅history -1
在我的 zsh 上有效)。我尝试zsh -f
使用默认选项,但仍然失败。
我Version AJM 93u+ 2012-08-01
在 MacOS 上使用 ksh 版本和 Zsh v5.9。
如何获取当前命令和参数的变量?我想使用转义代码将其打印在 Xterm 标题栏中。
我看到 MacOS 上的 Terminal.app 以某种方式确定了所调用命令的名称。我看到了 zsh 的后续实现,但我正在寻找 ksh。
if [ "$SHELL" = '/usr/bin/zsh' ]
then
case $TERM in
rxvt|*term)
precmd() { print -Pn "\e]0;%m:%~\a" }
preexec () { print -Pn "\e]0;$1\a" }
;;
esac
fi
我正在阅读这篇关于使用 ksh 的 DEBUG trap 的帖子,或者发帖人还评论说“运行后台任务,定期检查 ps -o stat= -o args= 的输出,以查看哪些进程在前台运行以及它们正在执行什么命令”是首选。有人有更多关于此的信息吗?
grep
这个高亮功能可以在中轻松实现--color
。但grep
不能同时进行正则匹配和反匹配,例如grep foo -v bar ...
(我需要这个功能,因为--color
只能在管道的初始输入时使用|
,因此后者的 grep 将使用该彩色结果,这使得grep foo --color=always ... | grep -v "foo bar"
不会删除那些带有“foo bar”的行)。
因此我使用了awk
上述链接提示,但它缺少突出显示功能。我们可以使用 和 提取正则表达式结果match
,substr
其中我们将正则表达式模式包装在 中match
。然后我们可以通过仅使用ANSI 颜色代码/\<no issue\>/
突出显示正则表达式结果。printf substr($0,1,RSTART-1) "\033[1;31m" substr($0,RSTART,RLENGTH) "\033[0m: " substr($0,RSTART+RLENGTH) "\n"
问:
但match
对于参考链接中由正则表达式构建的布尔表达式不起作用/foo/ && !/bar/
。有没有一种优雅的解决方法(也许使用其他工具)?
我想到了一个临时的解决方法/foo/ && !/bar/{match($0,/foo/); printf ...}
,但这会执行两次正则表达式。
我的预期行为(这里 0.“TODO”最多可以在一行中出现一次 1.我用来*...*
显示要突出显示的内容 2.我只考虑/pattern1/ && !/pattern_included_totally_by_pattern1/
,因此/foo/ && !/o/
不考虑Ed Morton提供的。这就像grep逻辑,我首先grep一些,然后在从前一个grep执行中获得的那些结果中进行grep):
# fail
$ echo "TODO foo\nTODO" | grep TODO --color=always | grep -v "TODO foo"
*TODO* foo
*TODO*
# expected
$ echo "TODO foo\nTODO" | awk -v RED="\033[1;31m" -v RESET="\033[0m" '/TODO/ && !/TODO foo/ {match($0,/TODO/); printf substr($0,1,RSTART-1) RED substr($0,RSTART,RLENGTH) RESET substr($0,RSTART+RLENGTH) "\n"}'
*TODO*
我正在使用一个 API(来自SyncroMSP),它返回分页的 JSON 数据。我可以获取页数,并且可以使用诸如 之类的工具获取数据curl
。每个块都是有效的 JSON,但它仅包含我需要的总数据的子集。
使用jq
或其他方式如何将tickets[]
这些分页数据块的元素合并回单个 JSON 文档?
以下是三个示例块。tickets[]
数组经过大量编辑,以解决此问题,实际上最多包含 25 个条目,并且每个票证条目包含更多元素,包括至少几个数组。
JSON 示例块 1 ( part_1.json
)
{
"tickets": [
{
"number": 4445,
"subject": "Your mailbox is almost full"
},
{
"number": 4444,
"subject": "Cannot VPN"
}
],
"meta": {
"total_pages": 3,
"page": 1
}
}
JSON 示例块 2 ( part_2.json
)
{
"tickets": [
{
"number": 4395,
"subject": "Trados Studio issue"
},
{
"number": 4394,
"subject": "Daily Backup Report(No Errors)"
}
],
"meta": {
"total_pages": 3,
"page": 2
}
}
JSON 示例块 3 ( part_3.json
)
{
"tickets": [
{
"number": 4341,
"subject": "Daily Backup Report(No Errors)"
},
{
"number": 4340,
"subject": "Windows Updates on VMs"
}
],
"meta": {
"total_pages": 3,
"page": 3
}
}
在这种情况下,预期结果将是这样的:
{
"tickets": [
{
"number": 4445,
"subject": "Your mailbox is almost full"
},
{
"number": 4444,
"subject": "Cannot VPN"
},
{
"number": 4395,
"subject": "Trados Studio issue"
},
{
"number": 4394,
"subject": "Daily Backup Report(No Errors)"
},
{
"number": 4341,
"subject": "Daily Backup Report(No Errors)"
},
{
"number": 4340,
"subject": "Windows Updates on VMs"
}
]
}
输出也可以包含哈希,因为我只是忽略它,并且哪个值被结转meta
并不重要。meta.page
您可以假设它tickets[].number
是唯一的,并且您不需要在该级别保留任何顺序tickets[]
。实际数据非常复杂,我不想在任何结果代码中声明完整的 JSON 结构。
这是我目前的尝试,但我对 并不是特别擅长jq
。有没有更好的方法 - 例如,不调用jq
两次,或者能够概括代码,这样我就不需要指定顶级数组的名称(tickets
)?
cat part_{1,2,3}.json | jq '.tickets[]' | jq -n '{ tickets:[ inputs ] }'
我想将哈希列表中的特定键输出为行,其中每个外部数组项都由空行分隔。为了说明:
输入是:
[
[
{
"visible": true,
"url": "url-1"
},
{
"visible": true
},
{
"visible": false,
"url": "url-2"
}
],
[
{
"visible": true,
"url": "url-a"
},
{
"visible": true,
"url": null
},
{
"visible": false,
"url": "url-b"
}
]
]
预期输出为:
url-1
url-2
url-a
url-b
现在,我可以使用以下命令获取我想要的输出:
cat input.txt | jq 'walk(if type == "object" then (.url | select( . != null)) end) | .[] | select(length > 0)' | jq 'join("\n")' | jq -rs 'join("\n\n")'
这里有两个问题:
null
)都由第一次jq
调用处理,因此我们得到了一个字符串列表的列表但对于这两个问题似乎应该有一个更简单的解决方案,特别是第二个问题。
我想测试函数的输出是否与我设想的它应该写入标准输出的文本相匹配。但下面的代码从未打印出来test PASS
,我不知道为什么。我也尝试\n
在变量中放入各种字符或删除它们,GROUND_TRUTH
但这没有帮助。
error_out()
{
printf "%s\n" "${ERROR}"
printf "Return to exit\n"
read -r THROW_AWAY
exit
}
ERROR="Test output."
OUTPUT_TO_TEST=$(error_out)
GROUND_TRUTH="Test output.\nReturn to exit\n"
{ [ "${OUTPUT_TO_TEST}" = "${GROUND_TRUTH}" ] \
&& printf "error_out test PASS\n"; } \
|| { \
printf "error_out test FAIL\n"; \
}
我使用的是 FreeBSD,shell 是“sh”。我想编写一个简单的脚本来安装软件包列表。通常,我会使用数组来存储软件包名称,但由于“sh”不支持数组,我认为最好的方法是使用空格分隔的字符串,如下所示:
packages="nameofpackage1 nameofpackage2 nameofpackage3"
这种方法的问题是,当我有很多包并且想按字母顺序排列它们时,稍后添加新包意味着我必须重新排列整个列表,同时还要记住每行 80 个字符。随着时间的推移,这会使结构更难管理。
我认为以“列表”布局列出软件包会更好。这样插入新软件包就更容易了,只需添加新行即可。但是,据我所知,这意味着我需要使用字符\
来继续行。如果有很多软件包,就会有很多\
字符。这会给 sh 带来任何问题吗?
packages="package_a \
package_b \
package_c \
package_d \
and so on"
有没有更好的方法?如果您有任何建议,我将不胜感激。
假设我有一个程序blackbox
和一个包含以下内容的文件:
in this file
this line contains =TAG=
so does =TAG= this one
as =TAG= does this other line
this line does not
nor does this line
=TAG= here again
gone again
我如何blackbox
仅在包含的行上运行=TAG=
?
注 1:一种方法是使用while read
循环,但这被认为是不好的做法。那么,什么是规范的、正确的方法来做到这一点(如果有的话)?
注 2:当然,如果我只是编辑文本,使用AWK
或 的解决方案sed
是合适的——但blackbox
可能会产生预期的副作用。这个问题适用于我需要执行另一个进程的情况。
注 3:您可能会问,如果blackbox
是类似nl
或的情况,会发生什么情况sort
— — 在多行上同时运行它与在每行上运行一个新进程的结果不同。在这种情况下,我希望能够通过以下三种方式中的每一种来做到这一点:
按块:=TAG=
用该块上的结果替换包含的每个连续行的块blackbox
。
预期输出为blackbox
= nl
:
in this file
1 this line contains =TAG=
2 so does =TAG= this one
3 as =TAG= does this other line
this line does not
nor does this line
1 =TAG= here again
gone again
逐行:将包含的每一行替换为该行=TAG=
的结果。blackbox
预期输出为blackbox
= nl
:
in this file
1 this line contains =TAG=
1 so does =TAG= this one
1 as =TAG= does this other line
this line does not
nor does this line
1 =TAG= here again
gone again
连续:将包含的所有行发送=TAG=
给一个进程,并在接收下一个块blackbox
之前用新打印的行替换每个块。blackbox
预期输出为blackbox
= nl
:
in this file
1 this line contains =TAG=
2 so does =TAG= this one
3 as =TAG= does this other line
this line does not
nor does this line
4 =TAG= here again
gone again
(如果我们使用sort
,所有匹配的行最终都会排在最后一个匹配的块中,因为它们直到最后才会被打印。)
我在这里没有发现任何关于一般问题的问题,但这些都是该问题的特殊情况:
我有一个摄像头捕捉程序和视频流程序一起作为 运行rpicam-vid ... | go2rtc
。我的问题是,go2rtc
只有当有人打开视频流时,它才会从管道读取数据,但rpicam-vid
即使视频流未启动,我也需要连续运行。当读取器未提取数据时,有没有办法简单地丢弃数据?
要通过... 命令使用带有“echo
进入文件”重定向运算符的命令,我已编写了 通过标准输入重定向到以超级用户身份执行的进程。要重定向的命令是,我在这里将其放在了原处。>>
sudo
sudo
echo "tun" >> /etc/modules-load.d/tun.conf
whoami
我试过
echo 'whoami' | sudo -i '$SHELL -c "exec $(< /dev/stdin)"'
接下来,
echo 'whoami' | sudo -i '$SHELL -c "$(< /dev/stdin)"'
并sh
作出回应-sh: /bin/sh -c "$(< /dev/stdin)": not found
。
这是为了什么?为什么 Alpine Linux 发行版找不到sh
通过 执行的命令sudo
?
sudo -V
(版本号和编译版本):
Sudo version 1.9.15p5
Sudoers policy plugin version 1.9.15p5
Sudoers file grammar version 50
Sudoers I/O plugin version 1.9.15p5
Sudoers audit plugin version 1.9.15p5
感谢您的回答!🙂