Reputation: 133
I wrote a little bash script to make a "shell" that prints the date before and after a command is executed:
while true
do date
printf "Prompt: "
read x
date
$x #Solution: this should be eval "$x"
done
The problem is that this "shell" doesn't recognize variables in $x, so for instance echo $PWD
outputs $PWD
instead of the current directory. A related consequence is that cd
does not work. How to fix/work around this? Thanks.
EDIT: Solved. Thanks everyone :-)
LATE EDIT: Actually the above isn't quite the solution; I needed to add the -r
option to the read
command, to prevent backslash sequences from being prematurely evaluated. Furthermore, the double quotes appear to be superfluous after all in this case (since the prepass would expand $x
and "$x"
to the same thing unless $x
is empty, and eval
does the same thing with no argument as it does with an empty string), but I suppose it never hurts to always include the quotes as a matter of security and good style.
Upvotes: 0
Views: 65
Reputation: 11445
If you're just trying to print out the date before and after, you can do that with PROMPT_COMMAND="$(date)"
in your .bashrc
. This will print out the date before your command prompt (meaning that it will also functionally be after your command since you'll get a prompt after the command finishes). It will be on a separate line from your PS1
, but you could add this to your PS1
instead if you'd rather it be there.
If you're trying to type in a literal echo $PWD
and have x
give the value of that, you can do eval "$x"
but most people will recommend against using eval
because anyone can type anything, like sudo rm -rf / --no-preserve-root
If you're trying to set x to be the name of a variable, i.e., x=PWD
, and you want to get the value of PWD
, you can do ${!x}
. This is called "indirection".
Upvotes: 3