如何使用目录作为参数运行一个命令,然后 cd 到相同的?我得到“没有这样的文件或目录”

Fir*_*ire 15 bash cd-command

我想构建一个简短的函数来执行以下操作。假设我将文件“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-argor insert-last-argument。它可以在 bash 联机帮助页中的“用于操作历史的命令”下或更详尽的Bash 参考手册中找到。)


Kaz*_*Kaz 6

您几乎肯定会遇到在参数扩展之前发生波浪号扩展的问题,这可以通过一个简洁的示例来解释:

$ 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是一个增加某些全局变量的函数。)

  • 你不需要`eval`。(永远。)但是很好地发现了扩展序列问题。如果您在这里提到使用 `eval` 历史扩展的更大可取性,这将是我认为最好的答案;其他人都没有真正解释*为什么*原始海报的解决方案失败。 (4认同)