默认情况下,xargs将连接其输入的许多行,然后传递给指定的命令。例如:
echo -e 'line 1\nline 2\nline 3' | xargs echo
Run Code Online (Sandbox Code Playgroud)
结果是
line 1 line 2 line 3
Run Code Online (Sandbox Code Playgroud)
由于参数被发送到单个 echo 命令(在命令行长度的限制内)。
有时您想使用替换字符串将参数放在命令中的其他位置,而不是末尾:
echo -e 'line 1\nline 2\nline 3' | xargs -Ix echo x DONE
line 1 DONE
line 2 DONE
line 3 DONE
Run Code Online (Sandbox Code Playgroud)
现在,xargs 每次 echo 调用只替换一个参数,因为正如手册页所说“-I 意味着 -L 1...”。这可能是典型情况下的正确行为,但是有什么方法可以覆盖它,以便我得到line 1 line 2 line 3 DONE输出吗?
请注意,我的示例只是说明性的 - 我对解决此问题的非 xargs 方法不太感兴趣。
有没有办法只留下那些通过某些(可能是任何)条件的字符串?根据字符串本身匹配某种模式(使用 grep)这一事实来过滤字符串是很简单的。但是,如果我有一个文件名列表并且只想保留那些目录怎么办?如果我有一个 URL 列表,并且只想保留那些在获取 URL 时不返回 404 的 URL,该怎么办?等等。这种逻辑可以用 bash 推广吗?
例子:
$ echo $LIST
/home/me/a
/home/me/b
/home/me/b/some.jpg
$ echo $LIST | ${//%(!$SOME_FANCY_BASH_FILTERING_LOGIC_TO_CHECK_IF_THIS_IS_A_DIRECTORY&%^#}
/home/me/a
/home/me/b
Run Code Online (Sandbox Code Playgroud) 因此,当我打开一个新终端(我在 Arch Linux 上使用 terminator)时,我将其配置为要么打开一个新tmux会话(如果会话不存在),要么附加到现有会话。当我exit在提示符下输入时,它会退出 tmux 会话。我必须exit再次输入才能退出终端。我想要的是,输入exit一次将退出终端,但保持tmux运行状态,因此下次我打开终端时,它将重新连接到上一个tmux会话。本质上,这相当于单击窗口管理器的退出按钮,但我希望在键入 时使用此功能exit。
编辑:
这就像我想要的:
alias exit='if [[ $TMUX = "" ]]; then exit; else tmux detach; exit; fi'
Run Code Online (Sandbox Code Playgroud)
但问题是应该在包含 tmux 会话的终端中调用exit之后,而不是 tmux 会话本身。tmux detach
当我在终端中导出时,我看到:
declare -x Apple_PubSub_Socket_Render="/private/tmp/com.apple.launchd.zTF2WfVZJa/Render"
declare -x DISPLAY="/private/tmp/com.apple.launchd.qhUQdpRp4B/org.macosforge.xquartz:0"
declare -x SSH_AUTH_SOCK="/private/tmp/com.apple.launchd.PowIf5erzI/Listeners"
Run Code Online (Sandbox Code Playgroud)
这些条目是什么?
在我运行 Yosemite 的 Mac 上安装了一些软件包,可以使终端 (iTerm 2) 中的生活变得更好一些。我安装了oh-my-zsh(我唯一拥有 oh-my-zsh 的 id抗原的插件)以及oh-my-git。
目前,当我运行 iTerm 2 或 Terminal 并且不在 git 存储库中时,我会看到以下内容:
james.mosier@fs215:~% 9:59 james.mosier@fs215
...以下图像形式:

1.) 删除输入末尾的时间戳和计算机名称 2.) 更改前缀以(至少)删除%符号
我非常了解我的方法.zshrc,至少对于我想要完成的上述目标来说是这样.profile。.bash_profile我似乎无法找到 $PS1 的设置位置和下面的输出,我认为这就是我应该寻找的。
我尝试做echo $PS1这给了我$(build_prompt),然后我做了echo $(build_prompt)这给了我的输出%n@%m:%~%#。.zshrc我在我的、oh-my-zsh.sh、.prompt.sh、 或文件中找不到此文本.base.sh。
我还找到了,$(build_prompt)但它似乎不包含我要更改的行的格式($(build_prompt)位于prompt.sh我的 oh-my-git 插件中,在此处找到文件)
在我上面链接的文件中,是否有可以更改的模式或字符串来更改终端的前缀和后缀?理想情况下,我想完全摆脱后缀并将前缀更改为默认终端前缀或~
我将我的环境设置为.profile. 我的.profile是幂等的,,,.bash_profile所有的源码。这样,无论我使用哪种 bourne 兼容 shell,也无论 shell 是交互式 shell 还是登录 shell,我总是获得相同的环境。.bashrc.kshrc.zshrc.profile
这也适用于非交互式ssh(1)使用,尽管我不确定到底为什么。
iridium:aram$ ssh sunos.mgk.ro 'env|grep ^PATH'
PATH=.:/home/aram/bin:/home/aram/bin/sunos:/home/aram/bin/sunos/amd64:/home/aram/bin/sunos/386:/home/aram/go/bin:/opt/local/bin:/opt/local/sbin:/usr/gnu/bin:/usr/bin:/sbin:/usr/sbin:/usr/sfw/bin:/usr/local/bin:/usr/local/sbin:/home/aram/plan9/bin
iridium:aram$ ssh iridium 'env|grep ^PATH'
PATH=.:/Users/aram/bin:/Users/aram/bin/darwin:/Users/aram/bin/darwin/amd64:/Users/aram/bin/darwin/386:/Users/aram/go/bin:/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/pkg/bin:/usr/pkg/sbin:/usr/local/plan9/bin
iridium:aram$ ssh crimson 'env|grep ^PATH'
PATH=.:/home/aram/bin:/home/aram/bin/linux:/home/aram/bin/linux/amd64:/home/aram/bin/linux/386:/bin:/usr/bin:/sbin:/usr/sbin:/usr/games:/usr/local/bin:/usr/local/sbin
Run Code Online (Sandbox Code Playgroud)
然而,在少数系统上,这不起作用。
iridium:aram$ ssh ci20 'env|grep ^PATH'
PATH=/usr/bin:/bin
Run Code Online (Sandbox Code Playgroud)
我一直在努力使这项工作成功,但没有成功。我努力了:
这些没有任何效果,无论 PAM 设置如何,似乎 /etc/environment 都根本不会被读取。
请不要建议我应该强制 bash 在 ssh 调用中进行交互,或者我应该在 ssh 调用中手动获取环境,我正在尝试解决这里的根本问题。
在尝试调试这个问题时,我学到了一些关于 bash 的知识。如果标准输入是套接字,那么 bash 似乎总是会获取 …
如何像使用文本编辑器编辑文件文本一样编辑目录中的文件名称?
我觉得我在视频中看过这个演示,也许使用了一些 Vim 插件或其他插件——或者也许是在 Sublime 文本中?
我希望能够进行正则表达式字符串替换、任意编辑等,而无需编写 shell 脚本或起草晦涩难懂的 shell 命令。
在尝试使 Bash for OSXTAB自动完成不区分大小写时,我按照建议运行这些命令:
shopt -s nocaseglob
bind 'set completion-ignore-case on'
Run Code Online (Sandbox Code Playgroud)
如何将上述设置恢复为 OS X 默认值?
您能否解释一下为什么我的 shell 中的Ctrl+会影响之前在后台运行的命令:Cbash
`./my_script.sh 1` &
Run Code Online (Sandbox Code Playgroud)
该命令立即完成执行,130代码如下:
[1]+ Exit 130 `./my_script.sh 1` &
Run Code Online (Sandbox Code Playgroud)
Ctrl+的通常行为C是杀死前台进程。这里发生了什么?
编辑1:(我的想法)也许与反引号有关 - 这里子子shell进程启动并且当父进程收到它时它以某种方式接收Ctrl+C
编辑2:我发现Ctrl+C使用反引号停止从当前 shell 运行的所有后台进程。
症状很简单。例如:
ls | grep a | grep b | grep c | grep d
Run Code Online (Sandbox Code Playgroud)
投掷
-bash: child setpgid (8948 to 8943): Operation not permitted
-bash: child setpgid (8950 to 8943): Operation not permitted
-bash: child setpgid (8952 to 8943): Operation not permitted
-bash: child setpgid (8953 to 8943): Operation not permitted
-bash: child setpgid (8954 to 8943): Operation not permitted
-bash: child setpgid (8955 to 8943): Operation not permitted
-bash: child setpgid (8962 to 8957): Operation not permitted
-bash: child …Run Code Online (Sandbox Code Playgroud)