我在 macOS 上尝试 grep 手册页时遇到了奇怪的行为。例如,Bash 手册页显然出现了字符串NAME:
$ man bash | head -5 | tail -1
NAME
Run Code Online (Sandbox Code Playgroud)
如果我 grep forname我确实得到了结果,但如果我 grep forNAME我没有:
$ man bash | grep 'NAME'
$ man bash | grep NAME
Run Code Online (Sandbox Code Playgroud)
我试过其他我知道的大写单词,SHELL搜索BASH结果没有任何结果。
这里发生了什么?
更新:感谢所有的答案!我认为值得添加我遇到这个问题的上下文。我想编写一个 bash 函数来包装man,如果我试图查找内置 shell 的手册页,请跳转到 Bash 手册页的相关部分。可能有更好的方法,但这是我目前所拥有的:
man () {
case "$(type -t "$1")" in
builtin)
local pattern="^ *$1"
if bashdoc_match "$pattern \+[-[]"; then
command man bash | less --pattern="$pattern +[-[]"
elif …Run Code Online (Sandbox Code Playgroud) 我有一个 shell 脚本,它使用以下内容在其输出中打印绿色复选标记:
col_green="\e[32;01m"
col_reset="\e[39;49;00m"
echo -e "Done ${col_green}?${col_reset}"
Run Code Online (Sandbox Code Playgroud)
在阅读了 Bash 的ANSI-C Quoting 之后,我意识到我可以在设置颜色变量时使用它并-e从我的echo 中删除标志。
col_green=$'\e[32;01m'
col_reset=$'\e[39;49;00m'
echo "Done ${col_green}?${col_reset}"
Run Code Online (Sandbox Code Playgroud)
这似乎很吸引人,因为这意味着无论是传递给 Bash 的内置echo还是外部 util /bin/echo(我使用的是 macOS),消息都能正确打印。
但这是否会降低脚本的可移植性?我知道 Bash 和 Zsh 支持这种引用风格,但我不确定其他人。
我一直在尝试弄清楚如何在 tmux 的复制模式下更改命令提示符的背景颜色。它默认为黑色橙色,至少在我的设置中是这样。
我用这些行更改了状态行中的命令提示符的颜色 .tmux.conf
set -g message-bg '#e7e7e7'
set -g message-fg '#000000'
Run Code Online (Sandbox Code Playgroud)
但这对显示在状态行上方的提示没有影响,例如,当我运行list-keys并点击/搜索时。该Search Down:提示是黑色橙色。
我希望我可以set -g message-command-bg '#e7e7e7'不用骰子来改变它,事实上,我根本不知道有什么message-command-style变化。手册说它改变了“状态行消息命令”的风格,但我不知道那会是什么,如果不是我用message-bg.
有什么帮助吗?
根据要求:我的.tmux.conf
# This seems to have no effect at all
set -g message-command-style bg=red
# nor does this
set -g message-command-bg red
# use UTF8
set -g utf8
set-window-option -g utf8 on
# 256 colors
set -g default-terminal "screen-256color"
# reload config
bind R source-file ~/.tmux.conf …Run Code Online (Sandbox Code Playgroud) 我正在尝试解析如下使用消息:
Usage:
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
docker-compose -h|--help
...
Commands:
build Build or rebuild services
bundle Generate a Docker bundle from the Compose file
...
Run Code Online (Sandbox Code Playgroud)
Command仅获取名称。所以我希望跳过所有行并包括该Commands:行,然后在所有后续行上打印第一个单词,即
build
bundle
...
Run Code Online (Sandbox Code Playgroud)
目前我正在做
docker-compose --help | sed -e '1,/Commands:/d' | awk '{ print $1 }'
Run Code Online (Sandbox Code Playgroud)
虽然这有效,但我怀疑我可以用一个awk. 到目前为止我最接近的是:
docker-compose --help | awk '/Commands:/,0 { print $1 }'
Run Code Online (Sandbox Code Playgroud)
但这包括匹配的Commands:行。可以做到吗?
我看过一些磁盘格式化/分区讨论,提到第一步要破坏现有的 GPT/MBR 数据结构:
sgdisk --zap-all /dev/nvme0n1
Run Code Online (Sandbox Code Playgroud)
我以前没有意识到这一点,当我设置磁盘时,我通常使用:
parted --script --align optimal \
/dev/nvme0n1 -- \
mklabel gpt \
mkpart ESP fat32 1MiB 512MiB \
set 1 boot on \
name 1 boot \
mkpart primary 512MiB 100% \
set 2 lvm on \
name 2 primary
Run Code Online (Sandbox Code Playgroud)
我应该先把事情清理干净(例如sgdisk --zap-all)吗?不这样做有什么缺点?
我喜欢在终端和 vim 中使用两种不同的设置。一种是在 vim 中使用浅色背景和有点花哨的航空公司状态栏。另一个使用深色背景和更准系统的 vim 外观。我要么出于优柔寡断,要么偶尔在两者之间摇摆不定。
随意在这两种配置之间轻松切换的智能方法是什么?现在我基本上有两个略有不同的.bash_profiles 和.vimrcs。当我想要变暗时,我手动获取暗配置文件,并定义了一个 bash 别名以使用备用 vimrc 启动 vim。我相信有更好的方法,我会对建议感兴趣。
更新:我采纳了设置主题环境变量以在配置文件中引用的极好建议。奇迹般有效。还发现了这个gem(不是 Ruby 意义上的),它让我同时将 iTerm 配置文件切换为深色配置文件。警告:将 bash 函数定义为这样的单行代码会给我一个语法错误,所以我不得不将它分成多行。
it2prof() {
echo -e "\033]50;SetProfile=$1\a"
}
alias dark="export THEME=dark && it2prof black && . ~/.bash_profile"
alias light="unset THEME && it2prof white && . ~/.bash_profile"
Run Code Online (Sandbox Code Playgroud)
更好的是,事实证明 iTerm2 有一堆可用于动态更改设置的转义码。
另一个更新:iTerm2 文档警告转义序列可能在 tmux 和 screen 中不起作用,实际上它们不起作用。为了让它们工作,你需要告诉多路复用器将转义序列发送到底层终端,而不是试图解释它。它有点毛茸茸,但现在在 tmux、屏幕和正常的 shell 会话中对我有用:
darken() {
if [ -n "$ITERM_PROFILE" ]; then
export THEME=dark
it2prof black
reload_profile …Run Code Online (Sandbox Code Playgroud) 我有一个可用的 OpenVPN 客户端配置,它使用受密码保护的私钥。
如果我openvpn直接运行,会提示我输入密码并且客户端成功启动。
但是,如果我以 开头,则不会提示systemctl我输入密码,并且服务永远不会完成初始化。
似乎systemd-ask-password正在等待密码短语,但没有显示提示。
$ sudo systemctl start openvpn-myclient.service
$ systemctl status openvpn-myclient.service
? openvpn-myclient.service - OpenVPN instance ‘myclient’
...
Status: "Pre-connection initialization successful"
...
CGroup: /system.slice/openvpn-myclient.service
??18997 openvpn --suppress-timestamps --config /path/to/client.conf
??18998 /path/to/systemd-ask-password --icon network-vpn Enter Private Key Password:
Run Code Online (Sandbox Code Playgroud)
我可以手动创建提示以提交密码:
$ sudo systemd-tty-ask-password-agent --query
Enter Private Key Password: ************************
Run Code Online (Sandbox Code Playgroud)
我也可以通过放入askpass /path/to/passphrase我的 client.conf 来解决这个问题。这避免了对用户输入的需要,但这也意味着以明文形式保存密码。
我想了解发生了什么,我可以做些什么来获得提示出现,或者我如何避免将密码以明文形式显示。
我该如何进一步调试?我阅读了以下手册页,但我仍然不清楚什么在起作用。
systemd-ask-passwordsystemd-tty-ask-password-agentsystemd-ask-password-wall.service我正在编写一个 bash 脚本,它可以为我做一些清理工作(清除当前目录中任何 Rails 项目的日志文件)。我正在使其可执行,但我不确定设置“组”和“其他”文件权限的最佳实践是什么。我应该将权限设置为 700 (只有所有者可以 rwx)吗?
我的部分困惑是当文件从一个系统复制到另一个系统时如何确定“所有权”。如果我的 UID 是 509 并且我将my_file.sh文件权限设置为 700,我猜测文件所有权是通过在文件上存储 UID 来确定的。如果我共享my_file.sh并且有人将其下载到他们的系统中,UID 是否会更改以匹配他们自己的?这是否取决于文件的传输方式(scp、git、http 等)?
我想在我的 .tmux.conf 中绑定到 control-minus 但它似乎不起作用:
bind C-- split-window -v
Run Code Online (Sandbox Code Playgroud)
这可能吗?
我在 bash 中经常使用增量搜索 (Ctl-r/Ctl-s),发现它非常有用。
我注意到 Meta-p (Esc p) 运行非增量搜索,我很好奇它的用途是什么,因为它存在增量等效项。它的袖子上是否有一些我忽略的技巧?如果你的命令历史绝对是巨大的,也许它会更快?
由于它不会为您提供从增量搜索中获得的相同交互式反馈,我想知道您为什么要使用它。