小编Tim*_*ske的帖子

如何使用 nounset shell 选项测试 4.2 版之前的 Bash 中是否定义了变量?

对于“GNU bash,版本 4.2”之前的 Bash 版本,是否有任何等效-vtest命令选项替代方案?例如:

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 test

22
推荐指数
2
解决办法
5万
查看次数

如何将 Bash 的进程替换与 HERE 文档结合起来?

在 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 …

bash process-substitution here-document

16
推荐指数
2
解决办法
4434
查看次数

为什么不在 OpenSSH ssh 的 ControlPath 选项中简单地使用 %h?

为什么“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

我想在由同一本地用户发起的所有会话之间共享到同一远程主机的连接,而不管远程用户和远程端口如何。主客户端的套接字应该位于本地用户的主目录下。

ssh openssh connection-sharing

13
推荐指数
2
解决办法
1万
查看次数

如何在 Bash 中使用 XDG 目录和路径?

我想知道如何不仅访问~/.config/user-dirs.dirswith 中定义的变量xdg-user-dir,例如"$(xdg-user-dir VIDEOS)",还访问以下标准变量:

  1. XDG_CACHE_HOME:-$HOME/.cache
  2. XDG_CONFIG_HOME:-$HOME/.config
  3. XDG_DATA_HOME:-$HOME/.local/share
  4. XDG_RUNTIME_DIR:-"/run/user/$USER"
  5. XDG_CONFIG_DIRS:-/etc/xdg
  6. XDG_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)

bash directory-structure freedesktop

10
推荐指数
1
解决办法
6749
查看次数

为什么 Bash 的“source”命令在从函数中调用时表现不同?

鉴于以下来源的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)

以下是我的问题:

  1. 当我source_import函数中调用 Bash 的命令而不是直接调用时,为什么会有所不同?
  2. 如何规范 Bashsource命令的行为?

我在 Fedora 版本 20 上使用 Bash 版本 4.2.47(1)-release。

bash source shell-builtin

10
推荐指数
2
解决办法
1万
查看次数

如何在不使用 lsof 或 fuser 的情况下退出 OpenSSH 控制主进程?

有没有更直接的方式来退出一个OpenSSH的控制主进程并删除其套接字文件不是与程序的帮助lsoffuser 不知道目的地本的接受的答案建议主机(连接方式)的问题?我想到了这样的事情:

$ 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

有任何想法吗?

ssh openssh

8
推荐指数
1
解决办法
2032
查看次数

git revert --quit 有什么用?

git-revert(1)联机帮助页中,我不清楚命令的quitabort选项之间的确切区别revert是什么。

从我对revert命令的练习中,我观察到该abort选项的工作方式与rebase命令之一非常相似,因为它试图重建当前分支的预操作状态。

此外,该quit选项的实际用例是什么?

git

7
推荐指数
1
解决办法
4295
查看次数

如何以编程方式更改 Vim 的命令类型模式?

有没有一种简单的方法可以在不丢失当前命令行的情况下从一种命令类型模式切换到另一种模式?

在我的~/.vimrc文件中,我将来自的<space><c-space>字符重新映射到:

  1. N,V,O => :
  2. 我 => :
  3. : => / => ?

完成上述行为的代码是:

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。理想情况下,它应该返回它当前分配给"寄存器的命令。然后将执行生成的命令。

scripting vim keyboard-shortcuts key-mapping

6
推荐指数
1
解决办法
538
查看次数

如何始终如一地启动 Vim 的命令行以在任何模式下进行映射?

我尝试从任何其他模式对 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)

scripting vim keyboard-shortcuts vimrc key-mapping

5
推荐指数
1
解决办法
383
查看次数

Bash 的声明 -p HISTIGNORE 使 bash 停止!为什么?

在 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,即模式与另一个分开。不转义单个模式没有任何效果,一个简单的命令仍然使它成为历史。

bash command-history glob

4
推荐指数
1
解决办法
1553
查看次数

在哪里放置命令的 Bash shell 重定向?

可能的重复:
重定向的顺序

除了独立exec >&2重定向当前 shell 的输入和输出之外,以下命令是否存在任何行为差异:

  1. echo -en "C\nB\nA\n" | sort 2>/dev/stdout >&2
  2. echo -en "C\nB\nA\n" 2>/dev/stdout >&2 | sort
  3. 2>/dev/stdout >&2 echo -en "C\nB\nA\n" | sort

如果上述命令等效,哪个是首选变体?

shell bash io-redirection file-descriptors

3
推荐指数
1
解决办法
545
查看次数

OpenSSH 的 SSH 客户端不遵守 IdentityFile 设置的顺序

如何指定 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)

openssh

3
推荐指数
1
解决办法
1284
查看次数

真的需要在 tmux 中绑定前缀键两次吗?

在解释终端多路复用器tmux和包含配置文件的 Git 存储库的各种博客中tmux.conf,我发现以下两行(可能具有不同的前缀键):

set -g prefix2 C-a
bind C-a send-prefix -2
Run Code Online (Sandbox Code Playgroud)

但我找不到答案是为什么需要第二行。据我了解,第一行已经将给定的键绑定为辅助前缀。我还尝试tmux仅使用第一行进行配置,它似乎有效。那么为什么要进行第二次绑定以再次显式发送辅助前缀键呢?

tmux configuration

2
推荐指数
1
解决办法
2030
查看次数