I'm trying to get better at one-liners here, this is what I have currently.
$ echo $PATH
/home/ubuntu/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
What I want to do is strip off that first chunk, so here's what I've figured out so far ---
$ echo $PATH | sed -e "s|^/[A-Za-z/]*:||"
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
The last thing I want to do here is to put that back into PATH, like export PATH=[that result]
The way I've tried this was as follows, which I can't get to work ---
$ echo $PATH | sed -e "s|^/[A-Za-z/]*:||" | xargs export PATH=
xargs: export: No such file or directory
Also, BTW, separate issue that confused me was with the sed expression above, for some reason when I tried using + rather than *, it wouldn't catch the first bit. Look ---
$ echo $PATH | sed -e "s|^/[A-Za-z/]+:||"
/home/ubuntu/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
Its like the +, meaning "one or more" doesn't work as well as the "many" *.
I think the best solution for that particular problem is:
export PATH=${PATH#*:}
But that doesn't answer the question of how to use stdin
to set an environment variable.
It's easy to use some process' stdout
:
export PATH=$(make_new_path)
But that's not strictly speaking using stdin
. The obvious solution:
make_new_path | export PATH=$(cat)
won't work because the commands to the right of the pipe are executed in a subshell, so variable settings won't stick. (If it had worked, it would have been an UUOC.)
As Gordon Davisson points out in a comment, you could simply use:
read -r PATH; export PATH
Also, it is actually not necessary to export PATH
, since PATH
comes pre-exported, but I left it in for the case where you want to use some other environment variable.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With