You can define a variable, and use a $
to recall its value:
apachelog=/var/log/apache2/error_log
tail -50 $apachelog
You're not going to do better in bash. In zsh, you can define global aliases, that are expanded everywhere on the command line:
alias -g apachelog=/var/log/apache2/error_log
tail -50 apachelog
But I don't recommend it, because now if you ever want to pass the string apachelog
as an argument to a command, you need to remember to quote it.
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
You can also prefix a back slash to disable the alias:
\ls
Edit: Other ways of doing the same include:
Use "command":
command ls
as per Mikel.Use the full path:
/bin/ls
as per uther.Quote the command:
"ls"
or'ls'
as per Mikel comment.You can remove the alias temporarily for that terminal session with
unalias command_name
.