Shell 如何在tcsh中转义别名链中的字符?

Shell 如何在tcsh中转义别名链中的字符?,shell,tcsh,Shell,Tcsh,我需要一个命令cds,该命令在dirs-v的输出中搜索字符串,然后使用pd+将我更改为包含该字符串的目录,而不将其从dirs中存储的目录环中删除。例如,如果“dirs-v”的输出为 然后我希望命令cdsbar执行相当于pd+1 我定义了这些: alias dv dirs -v alias pd pushd alias pds "dv | grep \!:1 | awk '{ print "\$1"}'" 但是要找到执行pd+n的最后一个别名,其中n是dirs-v输出中的当前条目,这是一个困难

我需要一个命令
cds
,该命令在
dirs-v
的输出中搜索字符串,然后使用
pd+
将我更改为包含该字符串的目录,而不将其从
dirs
中存储的目录环中删除。例如,如果“dirs-v”的输出为

然后我希望命令
cdsbar
执行相当于
pd+1

我定义了这些:

alias dv dirs -v
alias pd pushd
alias pds  "dv | grep \!:1 | awk '{ print "\$1"}'"
但是要找到执行
pd+n
的最后一个别名,其中n是
dirs-v
输出中的当前条目,这是一个困难的部分。以下是一次尝试,输出为:

% alias nds "\\\`pds \\!:1\\\`"
grep: Trailing backslash

正如你所看到的,我试图用一个反斜杠来逃避反斜杠,然后用另一个(逃避的)反斜杠来逃避反斜杠。但很明显,这不起作用。我需要做什么呢?

xargs
有时对于包含倒勾嵌套的“展开”命令很有用

在您的情况下,它可以像这样使用:

alias nds 'pds \\!:1 | xargs pd'

tcsh似乎不允许你用这样的斜杠来逃避反勾号。尝试回显“foo`bar”,看看你得到了什么。tcsh有点乱。在别名定义期间尝试使用单引号,因为您无论如何都不希望在其中计算内容。我通常使用
alias pds source~/.tcsh/alias/pds.tcsh
或类似的方法来避免整个问题……问题是,这会执行,例如“pd 1”,而我希望它执行“pd+1”。我不知道如何将加号和数字压缩在一起。我只是尝试了以下方法:别名nds“pds\\!:1 | sed's/([0-9]*)/pd+\1/”,但当我执行“nds foo”时,我得到了:sed:无法读取foo:没有这样的文件或目录。
alias nds 'pds \\!:1 | xargs pd'