【问题标题】:Properly quoting a tcsh alias using backticks使用反引号正确引用 tcsh 别名
【发布时间】:2021-04-07 11:46:24
【问题描述】:

我正在使用 tcsh。我想将“cdup”别名为cd,直到参考目录下一级的目录。例如,如果我的参考目录是 /home/myself/support/bugs/,并且我在 /home/myself/support/bugs/bug1/foo/bar,我希望 cdup 将目录更改为 /家/我自己/支持/错误/错误1。 我尝试了以下方法:

alias cdup 'cd `perl -e \'print $1 if $ENV{PWD} =~ m#\(/home/myself/support/bugs/[^/]+\)#\'`'

但我明白了:

不匹配的`。

【问题讨论】:

  • cd ../..相比,这似乎是不必要的复杂?
  • 如果他比他的参考目录低 5 个目录,那将无济于事。
  • 提出问题的方式可能包含错误 --- 如果您不在参考目录中,您的别名最终将是 cd,即。它会把你放在主目录中......这真的是你想要的吗?如果是这样,可以简化代码。如果没有,那该怎么办?

标签: linux perl alias tcsh


【解决方案1】:

其中一些引用是不必要的, 是什么让这更容易

alias cdup cd `perl -e'print $1 if $ENV{PWD} =~ m{(/home/user/support/bugs/[^/]+)}'`

或者你可以拆分工作,避免引用问题

set d=`perl -e'print $1 if $ENV{PWD} =~ m{(...)}'`; alias cdup $d; unset d

这两个都做同样的事情,在tcsh

但是,如果 pwd 不在那个“参考目录”中,那么别名最终会是 cd,这会让你回到主目录。这就是问题的提出方式——但这真的很需要吗?

在上述第一种方法中解决此问题的一种方法是,如果我们在引用层次结构之外,则将目录设置为当前目录本身

alias cdup cd `perl -e'$ENV{PWD} =~ m{(...)}; print $1 // $ENV{PWD}'`

这里的//defined-or operator

或者,在引用层次结构之外完全避免设置别名可能更合适,但那需要在tcsh中完成

set d=`perl -e'print $ENV{PWD} =~ m{(...)}'`; if ($d != "") alias cdup cd $d ; unset d

由于在正则表达式中捕获(),列表上下文中的匹配运算符(由print 强加)返回其捕获或undef(如果它不匹配),因此shell 的变量$d 最终成为捕获的值或空字符串。

然后有条件地设置别名——所以如果没有匹配项,则没有cdup


来自tcsh manual

别名 [姓名 [词表]]
没有参数,打印所有别名。使用 name,打印 name 的别名。使用 namewordlist,将 wordlist 指定为 name 的别名。 wordlist 是命令和文件名替换。 name 不能是“alias”或“unalias”。另请参阅 unalias 内置命令。

注意不要提及引号,单词列表

不需要引号

【讨论】:

  • @Ala_Poubelle 感谢您的署名。注意编辑——我添加了一种方法来避免在“参考”层次结构之外设置别名。 (那么cdup 根本不会作为命令存在。)当然,这可能是也可能不是你需要的——我只是让你知道现在也有这个选项
【解决方案2】:

所以根据https://unix.stackexchange.com/questions/339328/creating-alias-for-cmd-with-backticks(感谢 brian d foy),答案是:

alias cdup 'cd `perl -e '\''print $1 if $ENV{PWD} =~ m#(/home/wittmann/support/bugs/[^/]+)#'\''`'

这非常有效。感谢您使用 ''' 在单引号字符串中引入单引号 (') 的技巧。

【讨论】:

    【解决方案3】:

    这是一个没有外部命令的变体:

    alias cdup cd /home/myself/support/bugs/\$PWD:s./home/myself/support/bugs/..:ah
    

    它与原始行为的不同之处在于,如果在 reference directory 树之外使用,它会更改为 reference directory,这可能是首选,也可能不是。 p>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-26
      • 2019-04-23
      • 2023-04-02
      • 2014-11-22
      • 2013-11-15
      • 2011-09-22
      • 2010-09-11
      • 1970-01-01
      相关资源
      最近更新 更多