**
doesn't follow symlinks since bash-4.3
.
See CHANGES between bash-4.3-release
and bash-4.3-rc2
:
globstar (**) no longer traverses symbolic links that resolve to directories. This eliminates some duplicate entries.
The problem is that your alias definition (the one of iseRemoveSetup
) is in a subshell:
alias analyzer='setupise;'`iseAddToRemoveCall "analyzer"`
For iseAddToRemoveCall "analyzer"
a subshell is started and the alias definition affects only this subshell which is gone as soon as this line is done.
This could be solved by changing
alias analyzer='setupise;'`iseAddToRemoveCall "analyzer"`
to
alias analyzer='setupise;$(iseAddToRemoveCall analyzer)'
and replacing echo "iseRemoveSetup;$1"
(in iseAddToRemoveCall
) with echo "unalias $1;$1"
. Thus the unalias
would become part of the alias expansion and would be executed in the correct shell.
alternative
All this seems quite strange to me. Wouldn't it make more sense to start a subshell (type bash
), run the setup, run the commands, and leave the subshell (^D
) when finished?
additional remarks
man 1 bash
:
The first word of the replacement text is tested for aliases, but a word that is identical to an alias being expanded is not expanded a second time. This means that one may alias ls to ls -F, for instance, and bash does not try to recursively expand the replacement text.
So you don't need unalias p1
in your alias definition before you call pi
from it.
It may be better to use an (associative) array with the commands you want to unalias and just work with the array.
This is important, too, because you do exactly what you ought not to do:
Bash always reads at least one complete line of input before executing any
of the commands on that line. Aliases are expanded when a command is read, not when it is executed. Therefore, an alias definition appearing on the same
line as another command does not take effect until the next line of input is read. The commands following the alias definition on that line are not
affected by the new alias. This behavior is also an issue when functions are executed. Aliases are expanded when a function definition is read, not when
the function is executed, because a function definition is itself a compound command. As a consequence, aliases defined in a function are not available
until after that function is executed. To be safe, always put alias definitions on a separate line, and do not use alias in compound commands.
Best Answer
As noted in the
ALIASES
section ofman bash
Since you have defined your
grep
alias with such a blank last character, the shell will also expand any alias that you have defined forssh
- if that isalias ssh='ssh -X'
for example, then the command will becomewhich passes the
-X
as an additional argument toegrep
.Unless there is a particular reason to include the trailing blank, simply define the alias without it, i.e.