对于“GNU bash,版本 4.2”之前的 Bash 版本,是否有任何等效-v的test命令选项替代方案?例如:
shopt -os nounset
test -v foobar && echo foo || echo bar
# Output: bar
foobar=
test -v foobar && echo foo || echo bar
# Output: foo
Run Code Online (Sandbox Code Playgroud) 在 Bash 版本 4.2.47(1)-release 中,当我尝试连接来自 HERE-dcoument 的格式化文本时,如下所示:
cat <(fmt --width=10 <<FOOBAR
(I want the surrounding parentheses to be part of the HERE-document)
(Even the preceding unbalanced parenthesis should be part of it.
FOOBAR
) # I want this paranthesis to end the process substitution.
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
bash: bad substitution: no closing `)' in <(fmt --width=10 <<FOOBAR
(I want the surrounding parentheses to be part of the HERE-document)
(Even the preceding unbalanced parenthesis should be part of it.
FOOBAR
)
Run Code Online (Sandbox Code Playgroud)
此外,我不想引用 HERE …
为什么“ssh_config(5)”联机帮助页建议该ControlPath选项至少应包含%h,%p和%r占位符,以便唯一标识每个共享连接?
我认为多个会话应该共享同一个套接字并连接到同一个主机。那么有一个简单的定义是否有意义,例如:
ControlPath ~/.cache/ssh/mux/%h
Run Code Online (Sandbox Code Playgroud)
而不是像:
ControlPath ~/.cache/ssh/mux/%r@%h:%p
Run Code Online (Sandbox Code Playgroud)
根据我对第一个定义的理解,一个连接在不同远程用户的多个会话之间共享,连接到同一个远程主机,在不同的远程端口上。
我想在主机默认部分中有第一个定义,这样就足够了ssh -o ControlMaster=no。
我想在由同一本地用户发起的所有会话之间共享到同一远程主机的连接,而不管远程用户和远程端口如何。主客户端的套接字应该位于本地用户的主目录下。
我想知道如何不仅访问~/.config/user-dirs.dirswith 中定义的变量xdg-user-dir,例如"$(xdg-user-dir VIDEOS)",还访问以下标准变量:
XDG_CACHE_HOME:-$HOME/.cacheXDG_CONFIG_HOME:-$HOME/.configXDG_DATA_HOME:-$HOME/.local/shareXDG_RUNTIME_DIR:-"/run/user/$USER"XDG_CONFIG_DIRS:-/etc/xdgXDG_DATA_DIRS:-/usr/local/share:/usr/share为此,我在我的~/.bash_login文件中执行以下操作:
# Define standard directories.
declare -gx XDG_CACHE_HOME=~/.cache
declare -gx XDG_CONFIG_HOME=~/.config
declare -gx XDG_DATA_HOME=~/.local/share
declare -gx XDG_RUNTIME_DIR="/run/user/$USER"
declare -gx XDG_CONFIG_DIRS="$(IFS=: path /etc/xdg)"
declare -gx XDG_DATA_DIRS="$(IFS=: path /usr/local/share:/usr/share)"
# Source supplementary directories to export or overwrite existing standard ones.
declare a="$XDG_CONFIG_HOME/user-dirs.dirs"
if [[ -e $a ]]; then
source "$a"
declare b=""
for b in ${!XDG_*}; do
if [[ $b =~ ^XDG_[_[:alnum:]]+_DIR$ ]]; then
declare …Run Code Online (Sandbox Code Playgroud) 鉴于以下来源的barBash 脚本......
echo :$#:"$@":
Run Code Online (Sandbox Code Playgroud)
...以及以下可执行的fooBash 脚本:
echo -n source bar:
source bar
echo -n source bar foo:
source bar foo
function _import {
source "$@"
}
echo -n _import bar:
_import bar
echo -n _import bar foo:
_import bar foo
Run Code Online (Sandbox Code Playgroud)
运行fooBash 脚本时,我得到以下输出,即./foo:
source bar::0::
source bar foo::1:foo:
_import bar::1:bar:
_import bar foo::1:foo:
Run Code Online (Sandbox Code Playgroud)
以下是我的问题:
source从_import函数中调用 Bash 的命令而不是直接调用时,为什么会有所不同?source命令的行为?我在 Fedora 版本 20 上使用 Bash 版本 4.2.47(1)-release。
有没有更直接的方式来退出一个OpenSSH的控制主进程并删除其套接字文件不是与程序的帮助lsof或fuser 与不知道目的地本的接受的答案建议主机(连接方式)的问题?我想到了这样的事情:
$ ssh -O exit -S ~/.ssh/7eb92b0827f3e8e1e8591fb3d1a5cd1b94b758cb.socket
Run Code Online (Sandbox Code Playgroud)
我之所以这么问,是因为我正在寻找一种可编写脚本的方式来在每次注销我的用户帐户时退出每个打开的控制主连接。不这样做会导致我的sytemd -Powered openSUSE的计算机等待两分钟超时,直到它强行终止依然敞开控制主站连接关闭最终供电。
不幸的是,OpenSSH 的客户端程序ssh需要目标主机和ControlPath文件名模式才能推断出套接字文件的实际文件路径。相反,我想到了通过程序-S ctl_path选项提供具体套接字文件的更直接方法。
在系统范围的OpenSSH客户端配置文件的全局部分,我配置了OpenSSH 的连接多路复用功能,如下所示:
ControlMaster auto
ControlPath ~/.ssh/%C.socket
ControlPersist 30m
Run Code Online (Sandbox Code Playgroud)
请注意,我想保持套接字文件的文件名模式,即哈希令牌字符串%l%h%p%r与令牌%C。
有任何想法吗?
从git-revert(1)联机帮助页中,我不清楚命令的quit和abort选项之间的确切区别revert是什么。
从我对revert命令的练习中,我观察到该abort选项的工作方式与rebase命令之一非常相似,因为它试图重建当前分支的预操作状态。
此外,该quit选项的实际用例是什么?
有没有一种简单的方法可以在不丢失当前命令行的情况下从一种命令类型模式切换到另一种模式?
在我的~/.vimrc文件中,我将来自的<space>和<c-space>字符重新映射到:
完成上述行为的代码是:
function! s:ModMapSpaceChar()
noremap <unique> <space> :
map <unique> <nul> <c-space>
map! <unique> <nul> <c-space>
noremap <unique> <c-space> /
inoremap <unique> <c-space> <c-o>:
cnoremap <unique> <c-space> <c-\>eg:ToggleCmdTypes()<cr><c-c>@"
let g:CmdTypes={':' : '/', '/' : '?', '?': ':'}
function! g:ToggleCmdTypes()
let a=getcmdtype()
let b=get(g:CmdTypes, a, a)
let c=getcmdline()
let @"=b . c
return ''
endfunction
endfunction
call s:ModMapSpaceChar()
Run Code Online (Sandbox Code Playgroud)
在我的方法中困扰我的是不纯的函数g:ToggleCmdTypes。理想情况下,它应该返回它当前分配给"寄存器的命令。然后将执行生成的命令。
我尝试从任何其他模式对 Vim 命令行模式的访问进行规范化,以简化我的实际映射。例如,为了让<f6>密钥在任何地方工作,我定义了以下映射:
noremap <script> <unique> <silent> <f6> <sid>:echomsg 'Hello World!'<cr>
noremap! <script> <unique> <silent> <f6> <sid>:echomsg 'Hello World!'<cr>
Run Code Online (Sandbox Code Playgroud)
上述映射<sid>:在开始工作之前重新映射到下面给出的键映射:
noremap <unique> <expr> <sid>: <sid>StartCmdLineMode()
noremap! <unique> <expr> <sid>: <sid>StartCmdLineMode()
function! s:StartCmdLineMode()
let a=mode()
if a ==# 'n'
return ':'
" Type <c-v><c-v> to insert ^V.
elseif a =~ '[vV^V]'
return ":\<c-u>"
elseif a ==# 'no'
return "\<c-c>:"
elseif a ==# 'i'
return "\<c-o>:"
elseif a ==# 'c'
let b=getcmdtype()
if b ==# ':'
return "\<c-e>\<c-u>" …Run Code Online (Sandbox Code Playgroud) 在 GNU bash,版本 4.2.45(1)-release (x86_64-redhat-linux-gnu),Fedora 19 中执行以下代码...
shopt -s extglob
export HISTIGNORE="!(+(!([[\:space\:]]))+([[\:space\:]])+(!([[\:space\:]])))"
declare -p HISTIGNORE
Run Code Online (Sandbox Code Playgroud)
... 使 bash 完全停止。此后它不会打印命令提示符。这是为什么。
背景:
我只想告诉 bash 忽略任何简单的命令,即一个单词的命令。Bash 不应该记住像cd, pwd,history等命令行。我对HISTIGNORE变量的原始定义如下所示:
export HISTIGNORE="!(+(!([[:space:]]))+([[:space:]])+(!([[:space:]])))"
Run Code Online (Sandbox Code Playgroud)
我\在每个:冒号字符之前添加了一个反斜杠字符,因为根据bash信息页面,后者将每个(扩展的)shell glob,即模式与另一个分开。不转义单个模式没有任何效果,一个简单的命令仍然使它成为历史。
可能的重复:
重定向的顺序
除了独立exec >&2重定向当前 shell 的输入和输出之外,以下命令是否存在任何行为差异:
echo -en "C\nB\nA\n" | sort 2>/dev/stdout >&2echo -en "C\nB\nA\n" 2>/dev/stdout >&2 | sort2>/dev/stdout >&2 echo -en "C\nB\nA\n" | sort如果上述命令等效,哪个是首选变体?
如何指定 OpenSSH 的 SSH 客户端(OpenSSH_7.5p1、OpenSSL 1.0.2k 2017 年 1 月 26 日;Git for Windows v2.11.1)向 SSH 兼容守护进程(例如 Apache Mina SSHD(Gerrit)提供公钥/私钥对的顺序)代码审查服务)。我的目的是在回退到 RSA 之前尝试使用 Ed25519 公钥/私钥对进行身份验证。
鉴于用户主目录下的以下标准 Ed25519 和 RSA 公钥/私钥对:
~/.ssh/id_ed25519{,.pub}~/.ssh/id_rsa{,.pub}以及用户 SSH 配置文件 (~/.ssh/config) 中的以下主机部分:
Host foobar foobar.example.com
Hostname foobar.example.com
IdentityFile ~/.ssh/id_ed25519
Host *
IdentityFile ~/.ssh/id_ed25519
IdentityFile ~/.ssh/id_rsa
Run Code Online (Sandbox Code Playgroud)
在调试模式下测试 SSH 连接时:
$ ssh -Tv bob@foobar
debug1: Reading configuration data ~/.ssh/config
debug1: ~/.ssh/config line 49: Applying options for foobar
debug1: ~/.ssh/config line 63: Applying options for *
debug1: Authentications that …Run Code Online (Sandbox Code Playgroud) 在解释终端多路复用器tmux和包含配置文件的 Git 存储库的各种博客中tmux.conf,我发现以下两行(可能具有不同的前缀键):
set -g prefix2 C-a
bind C-a send-prefix -2
Run Code Online (Sandbox Code Playgroud)
但我找不到答案是为什么需要第二行。据我了解,第一行已经将给定的键绑定为辅助前缀。我还尝试tmux仅使用第一行进行配置,它似乎有效。那么为什么要进行第二次绑定以再次显式发送辅助前缀键呢?