Bash命令行后缀宏

时间:2014-07-21 09:37:42

标签: bash shell macros

是否可以创建一个适用于后缀的自定义bash宏(类似于&)?

示例:让XX成为自定义“后缀宏”。然后cp file /tmp XX将执行与XX相关联的宏。

目标:我想创建一个切换到最后一个参数的宏,这样我就可以复制一个文件直接跳转到我复制到的文件夹中。 (我知道我可以做一个“cpd”别名或实现此目的的东西,但我想知道是否有一种方法可以像我描述的那样创建宏。)

1 个答案:

答案 0 :(得分:1)

你可以通过在Bash中使用$ _来实现这一点(虽然它不是宏)但是如果你只是需要它来复制文件然后移动到复制的文件夹然后执行像我在“OR”后显示的那样

$ echo a b c; echo $! - !$ - $_
echo a b c; echo $! - $! - $_
a b c
- - c

OR

$ pwd
/home/c10001/giga

$ ls -l rerun.sh
-rwxr-xr-x 1 c10001 Domain Users 76 Jul 22 13:25 rerun.sh


$ ls -ld test; ls -l test
drwxr-xr-x+ 1 Administrators Domain Users 0 Jul 17 12:23 test
total 0

drwxr-xr-x+ 1 Administrators Domain Users 0 Jul 17 12:23 java
drwxr-xr-x+ 1 Administrators Domain Users 0 Jul 17 12:23 resources


$ cp rerun.sh 1; cd $_; pwd; ls -l rerun.sh

/home/c10001/giga/1

-rwxr-xr-x 1 c10001 Domain Users 76 Jul 24 09:41 rerun.sh

现在,如果你真的想要一个MACRO类型的功能,你可以尝试在BASH中使用“eval”(提示)。 即注意:$ _设置为最后一个命令传递的最后一个参数。

$ pwd
/home/c10001/giga

$ cp rerun.sh 1; echo $_; XX=";cd $_";
1

$ echo $XX
;cd 1

$ eval cp rerun.sh 1 $XX

$ pwd
/home/c10001/giga/1

如您所见,我在将rerun.sh复制到文件夹1期间运行eval来处理$ XX,因为XX设置为“; cd $ _”,它已经扩展了它的值并且已经cd到该文件夹​​。使用“;”在上面的 eval 行中,需要设置XX以将cp命令与cd命令分开。

如果XX设置为“; cd $ _”并且XX现在变为“; cd 1”(即你执行了“cp rerun.sh 1”),那么这也会有效,但是如果你运行“eval” cp rerun.sh 2 $ XX“即将rerun.sh复制到另一个文件夹,这是文件夹 2 ,一旦eval ...完成,你将在/ home / c10001 / giga / 2文件夹。