我想构建一个简短的函数来执行以下操作。假设我将文件“file.tex”移动到我的文档目录:
mv file.tex ~/Documents
Run Code Online (Sandbox Code Playgroud)
然后,我cd
想到那个目录:
cd ~/Documents
Run Code Online (Sandbox Code Playgroud)
我想将其推广到任何目录,以便我可以这样做:
mv file.tex ~/Documents
follow
Run Code Online (Sandbox Code Playgroud)
并让follow
命令从上一个命令读取目标,然后相应地执行。对于一个简单的目录,这不会节省很多时间,但是在处理嵌套目录时,能够只使用
mv file.tex ~/Documents/folder1/subfolder1
follow
Run Code Online (Sandbox Code Playgroud)
我认为这会相对简单,我可以做这样的事情:
follow()
{
place=`history 2 | sed -n '1p;1q' | rev | cut -d ' ' -f1 | rev`
cd $place
}
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用。如果我 echo $place
,我确实得到了所需的字符串(我正在用 测试它~/Documents
),但最后一个命令返回
No such file or directory
Run Code Online (Sandbox Code Playgroud)
该目录肯定存在。我不知所措。你能帮我吗?
hee*_*ayl 18
您可以使用变量 代替定义函数,该变量$_
被 扩展为上一个命令的最后一个参数bash
。所以使用:
cd "$_"
Run Code Online (Sandbox Code Playgroud)
mv
命令后。
您也可以使用历史扩展:
cd !:$
Run Code Online (Sandbox Code Playgroud)
如果必须使用函数:
follow () { cd "$_" ;}
Run Code Online (Sandbox Code Playgroud)
$ follow () { cd "$_" ;}
$ mv foo.sh 'foo bar'
$ follow
foo bar$
Run Code Online (Sandbox Code Playgroud)
注意:此答案针对您在处理位置参数时使用的确切命令行参数格式。对于其他格式,例如mv -t foo bar.txt
,您需要事先合并特定检查,那么包装器将是合适的。
Dub*_*ubu 14
使用标准的 bash 键绑定,该组合Alt.会将上一个命令行的最后一个参数复制到当前命令行中。所以,打字
$ mv foo ~/some/long/path/
$ cd <Alt><.>
Run Code Online (Sandbox Code Playgroud)
会屈服
$ mv foo ~/some/long/path/
$ cd ~/some/long/path/
Run Code Online (Sandbox Code Playgroud)
而且打字的次数甚至比字少follow
。
为了更加方便,重复Alt.组合将浏览所有先前命令行的最后一个参数。
附录:该组合键对应的 bash 命令名称为yank-last-arg
or insert-last-argument
。它可以在 bash 联机帮助页中的“用于操作历史的命令”下或更详尽的Bash 参考手册中找到。)
您几乎肯定会遇到在参数扩展之前发生波浪号扩展的问题,这可以通过一个简洁的示例来解释:
$ cd ~kaz
kaz $ var='~kaz'
kaz $ echo $var
~kaz
kaz $ cd $kaz
bash: cd: ~kaz: No such file or directory
Run Code Online (Sandbox Code Playgroud)
这可以通过eval
. 无论如何,您将需要eval
,因为您正在从历史记录中提取命令,并且它们可以包含任意扩展,例如:
$ mv file.tex ~/Documents/$(compute_folder_name foo-param)/subfolder1
$ follow
Run Code Online (Sandbox Code Playgroud)
(存在一些问题,例如这些值的重新扩展可能不再与发生的原始扩展匹配。假设compute_folder_name
是一个增加某些全局变量的函数。)
归档时间: |
|
查看次数: |
3080 次 |
最近记录: |