在命令行上,我可以在命令后使用>
or|
运算符将命令的输出重定向或管道输出到文件或另一个命令。我遇到了一个不太标准的情况,我想将输出重定向到一个文件,但我似乎没有机会重定向它:
在新航站楼时,
[chiliNUT ~]$
Run Code Online (Sandbox Code Playgroud)
如果我Tab不先输入任何东西就按下,我会被问到
display all 1725 possibilities? (y or n)
Run Code Online (Sandbox Code Playgroud)
如果我然后输入y,我会得到一长串不同的命令。如何将此输出重定向或通过管道传输到文件?我似乎没有机会在> myfile.txt
任何地方打字。
使用CentOS 6.4 版(最终版)。
Ubuntu 中的 Bash 如何知道工具的特定操作列表?
例如,如果我键入apt-get和 tab 两次,我只能看到删除、更新、升级...等,但看不到另一个命令的操作或当前目录中的文件。
我正在用 Go 开发一个命令行工具,并希望为支持它的发行版提供此功能。
bash 是否有一个组合键可以自动竞争历史命令?例如,在 ipython 和 matlab 中,这是通过在键入几个字符后按向上箭头来实现的。
在 中bash
,使用complete
内置命令设置自定义完成命令参数非常容易。例如,对于一个具有以下概要的假设命令
foo --a | --b | --c
Run Code Online (Sandbox Code Playgroud)
你可以
complete -W '--a --b --c' foo
Run Code Online (Sandbox Code Playgroud)
当你按你还可以自定义你完成Tab在空提示符下使用complete -E
,例如complete -E -W 'foo bar'
。然后,在空提示下按 Tab 只会建议foo
和bar
。
如何在非空提示下自定义命令完成?例如,如果我写f
,我如何自定义完成以使其完成foo
?
(我想,实际情况是loc
TAB?localc
。而我的兄弟,谁促使我提出这一点,与希望它mplayer
。)
在 zsh(以及 bash)中,您可以使用一些历史词扩展来表示来自先前命令的参数。
此示例显示从历史记录中的上一个命令中获取第二个参数并进行!:#
扩展:
% echo foo bar baz
foo bar baz
% echo !:2
echo bar
bar
Run Code Online (Sandbox Code Playgroud)
我经常忘记特定参数是什么 # 参数,并且!:#
当我记得它是哪个参数时,输入并不总是那么快。我知道meta-.
要替换最后一个参数,但有时它不是我想要的最后一个参数。
我想添加上一个命令中的参数作为完成我在 zsh 中输入的任何命令的建议。
我能够弄清楚如何创建一个 shell 函数,该函数可以从最后一个命令创建一个参数数组 (0..N) 并将其绑定到特定命令。
_last_command_args() {
last_command=$history[$[HISTCMD-1]]
last_command_array=("${(s/ /)last_command}")
_sep_parts last_command_array
}
# trying to get last_command_args to be suggested for any command, this just works for foo
compdef _last_command_args foo
Run Code Online (Sandbox Code Playgroud)
这就是完成 foo 的样子,我点击了 tab 键<TAB>
:
% echo bar baz qux
bar baz qux
% foo <TAB> …
Run Code Online (Sandbox Code Playgroud) Git完成:
我的系统上的 git 文件名自动完成有困难。我在 OS X (10.9.3) 上使用zsh
(5.0.5) 和git
(1.9.3)。双方zsh
并git
已通过自制软件已经安装完毕。(完整版输出在帖子底部。)
git
的文件名补全没有像我期望的那样插入空格。当我输入名称中带有空格的文件名时,shell 会插入文件名而不转义空格。zsh
的内置完成不会这样做,但git
's 做了。
这是我所看到的一个例子。
我有一个存储库,其中包含一些名称中带有空格的文件。
% ls -la
test
test four - latest.txt
test three.txt
test two
Run Code Online (Sandbox Code Playgroud)
当我使用制表符完成插入文件名时,shell 反斜杠会按预期对文件名进行转义。
% echo "testing" >> test<tab>
Run Code Online (Sandbox Code Playgroud)
点击标签三下后自动完成。
% echo "testing" >> test\ four\ -\ latest.txt
––– file
test test\ four\ -\ latest.txt test\ three.txt test\ two
Run Code Online (Sandbox Code Playgroud)
git status
用引号显示这些文件名(它完全理解发生了什么):
% git status --short
M test
M "test four - latest.txt" …
Run Code Online (Sandbox Code Playgroud) 在 中zsh
,该cd
命令具有两个参数的形式:cd OLD NEW
更改为${PWD/OLD/NEW}
。使用新式补全系统,zsh 能够补全NEW
:第二个参数根据OLD
可替换的内容补全,以获取现有目录。但是第一个参数只对现有目录完成。
OLD
除了完成现有目录之外,如何让 zsh 提供可能值的完成?
例如,如果当前目录是/path/to/foo
并且还有目录/also/to/foo
and /path/to/foo/prime
,则cd p
Tab完成p
到prime
。如果我打算运行,cd path also
那么我希望 zsh 也path
作为完成提供。如何?
使用第二个参数的已输入值来限制第一个参数的可能性将是一个加号,但独立完成第一个参数也可以。
是否可以在按 Tab 键时禁用 bash 的自动完成功能?
我想这样做的原因是我经常将代码从编辑器中粘贴到我的终端中,在那里我使用制表符而不是许多空格作为缩进。
不,你不能说服我使用空格而不是制表符。
我正在处理大量文件,这些文件保存在一个目录中。每次我进入该目录Tab并不小心按两次时,显示与模式匹配的文件需要很长时间(可能超过一分钟),而且我对这种行为感到非常恼火。
比如我的目录结构是:
my-project/
??? docs/
??? data/ <---- contains around 200k files.
??? analyser/
Run Code Online (Sandbox Code Playgroud)
由于我仍然喜欢完成,无论如何只能在data/
目录中禁用此功能吗?像设置超时 5 秒,或者在特定目录中自动关闭完成的脚本?
在 bash 中,我可以使用制表符补全将一个目录向上移动并再次向下移动另一条路径。例如,假设我在$HOME/folder1
,我想cd
给$HOME/folder2
。$HOME
只有两个子目录folder1
和folder2
.
在 bash 中,我可以输入
cd ..[TAB]f[TAB]2
Run Code Online (Sandbox Code Playgroud)
并且最终会在$HOME/folder2
. 在我全新的 zsh 安装中,按cd ..[TAB]
会生成一个名称中$HOME/folder1
包含两个子目录的列表.
。
有没有一种简单的方法来获得我习惯的行为?或者有什么更容易在 zsh 中实现我想要的?
autocomplete ×10
bash ×6
zsh ×4
cd-command ×1
directory ×1
git ×1
oh-my-zsh ×1
pipe ×1
ubuntu ×1