Search code examples
shellaliasdereferencetcsh

alias shell variable dereference


I move about a lot in paths, and trying to use an alias set to minimize typing:

alias restore       'set restore=\!*; cd \$${restore}'
alias save          'setenv \!* `pwd`'

I'm using tcsh; the save works but the restore fails:

2% save x
2% cd
2% restore x
$x: No such file or directory.

I inspect the var (x) and it's fine so I'm not dereferencing right?


Solution

  • This works:

    alias restore ' cd ` echo $\!* ` '
    

    Your original attempt can be better written as:

    alias restore ' cd \$\!* '
    

    This (and your original one) doesn't work because variable expansion needs to happen first, and in this case there is no variable expansion, because $ is escaped. After !* is expanded, there isn't another variable expansion happening.

    In my proposed solution I avoid escaping $ by running a echo in a sub-shell, so it works fine.


    Just to make sure, you are aware of pushd and popd, right? For most users, those are useful and powerful enough, though I can certainly see the value in your aliases here.