Can't remove an item in $PATH (Xamarin Workbooks) - bash

The following directory no longer exists on my MacBook Pro after I uninstalled Visual Studio Community Edition for Mac. I can copy and paste it from the $PATH though here:
/Applications/Xamarin Workbooks.app/Contents/SharedSupport/path-bin
It's still in the $PATH but I can't tell where it is being set
~ $ grep -n SharedSupport ${HOME}/.bash_profile
~ $ grep -n SharedSupport ${HOME}/.bashrc
~ $ grep -n SharedSupport ${HOME}/.profile
~ $ grep -n SharedSupport ${HOME}/.zshrc
~ $ grep -n SharedSupport ${HOME}/.zprofile
~ $ grep -n SharedSupport ${HOME}/.zlogin
Any ideas how to remove it from the $PATH? I uninstalled it so naturally the terminal can't find the folder. Now I can't find where it's being exported to PATH so I can remove it.

Just figured it out! Turns out it stores its paths in a file in /etc/paths.d called Xamarian, like Jonathan Leffler commented. So in order to delete it, we'll need to:
Open a terminal, this can be iTerm, Terminal, etc.
CD Into the Directory
cd /etc/paths.d
Remove the file called xamarian with rm,
rm -rf xamarian
That's it!

In my case, there is a file called workbooks in /etc/paths.d.
Open the file by vim and edit it

Related

Alternative to dirname command that supports spaces

Consider the following output, when run the command:
$ /usr/libexec/java_home -v 1.8
/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home
The command dirname are not getting right the directory name:
$ echo $(dirname $(/usr/libexec/java_home -v 1.8))
/Library Plug-Ins/JavaAppletPlugin.plugin/Contents
I think dirname nor supports spaces. I'm behind macOS with Big Sur.
After the tip of #Shawn the solution is simple: just use quotes...
$ echo "$(dirname "$(/usr/libexec/java_home -v 1.8)")"
/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents
Thanks #Shawn!

Uninstalled Anaconda still shows up in PATH (Mac OS X)

I have installed Anaconda a few months ago but then uninstalled it and removed all anaconda files by using
rm -rf ~/anaconda
but when I run
echo $PATH
it still outputs a path that point to an Anaconda folder but when I search for it, it doesn't even exist, why is that happening?
What makes you think that non-existent directory are automatically
removed from $PATH? They are not. As an example I can make a new dir
and go there:
$ mkdir /tmp/new-path-dir && cd /tmp/new-path-dir
Add it to the $PATH:
$ PATH=/tmp/new-path-dir:$PATH
$ echo $PATH
/tmp/new-path-dir:<REST_OF_PATH>
Make a new olleh.so (hello spelled backwards) executable inside
it:
$ echo 'echo hi' > olleh.so && chmod +x olleh.so
Then go back to ~:
$ cd ~
And start a olleh.so:
$ olleh.so
hi
Now I can safely remove /tmp/new-path-dir:
$ rm -r /tmp/new-path-dir/
And it still will be shown in my $PATH:
$ echo $PATH
/tmp/new-path-dir:<REST_OF_PATH>
But I won't be able to run olleh.so any more:
$ olleh.so
bash: /tmp/new-path-dir/olleh.so: No such file or directory
And as paths to executables are cached by bash I can get rid of
olleh.so permanently like this:
$ hash -r
$ olleh.so
bash: olleh.so: command not found

How to get the windows path from in Bash On Windows (equivalent to cygpath)?

Cygwin has cygpath:
$echo $(cygpath -pw "/cygdrive/c/users/bob/test")
$C:\users\bob\test
How can I achieve the same on Bash on Windows?
The Windows drives are located under the /mnt directory, that is c:/ is at /mnt/c and d:/ is at /mnt/d
Thus you could use the following function (put the function in your .bashrc file)
function windir() {
pwd | sed -E 's+^/mnt/(.{1})+\1:+' | sed 's+:$+:/+1'
}
The first sed command translates "/mnt/c" to "c:" (or d: or whatever the drive letter is). The second sed command handles the special case of the root directory. I am sure there are more elegant ways to do it, but this seems to work.
The original accepted answer from EJK worked fine, but is outdated - to get the path (since years) just use wslpath -w, which will return the same windows path as cygpath for every directory that is mounted fro the windows side and will return an UNC path for everything that is only available on the WSL side:
$ wslpath -w ~
\\wsl.localhost\Debian\home\bob
$ wslpath -w /mnt/c/users/bob/test
C:\users\bob\test
For the other way around - drop the -w and use single quotes:
$ wslpath -w '\\wsl.localhost\Debian\home\bob'
/home/bob
$ wslpath 'C:\users\bob\test'
/mnt/c/users/bob/test

Mac terminal keeps giving message

Whenever I open my terminal on my mac I get this message, -bash: /usr/local/bin: is a directory
How do I remove this? As I find it annoying and unneeded.
There is probably a line trying to execute /usr/local/bin (which is a directory and not a executable) in either your ~/.bash_profile or your ~/.bashrc
If you want to view the contents of these files (as you asked above) you can type in your terminal after you open it:
cat ~/.bash_profile
and
cat ~/.bashrc
You can try to verify what lines mention /usr/local/bin by typing these commands:
cat ~/.bash_profile | grep "/usr/local/bin"
and
cat ~/.bashrc | grep "/usr/local/bin"

How to find out where alias (in the bash sense) is defined when running Terminal in Mac OS X

How can I find out where an alias is defined on my system? I am referring to the kind of alias that is used within a Terminal session launched from Mac OS X (10.6.3).
For example, if I enter the alias command with no parameters at a Terminal command prompt, I get a list of aliases that I have set, for example:
alias mysql='/usr/local/mysql/bin/mysql'
However, I have searched all over my system using Spotlight and mdfind in various startup files and so far can not find where this alias has been defined. ( I did it a long time ago and didn't write down where I assigned the alias).
For OSX, this 2-step sequence worked well for me, in locating an alias I'd created long ago and couldn't locate in expected place (~/.zshrc).
cweekly:~ $ which la
la: aliased to ls -lAh
cweekly:~$ grep -r ' ls -lAh' ~
/Users/cweekly//.oh-my-zsh/lib/aliases.zsh:alias la='ls -lAh'
Aha! "Hiding" in ~/.oh-my-zsh/lib/aliases.zsh. I had poked around a bit in .oh-my-zsh but had overlooked lib/aliases.zsh.
you can just simply type in alias on the command prompt to see what aliases you have. Otherwise, you can do a find on the most common places where aliases are defined, eg
grep -RHi "alias" /etc /root
First use the following commands
List all functions
functions
List all aliases
alias
If you aren't finding the alias or function consider a more aggressive searching method
Bash version
bash -ixlc : 2>&1 | grep thingToSearchHere
Zsh version
zsh -ixc : 2>&1 | grep thingToSearchHere
Brief Explanation of Options
-i Force shell to be interactive.
-c Take the first argument as a command to execute
-x -- equivalent to --xtrace
-l Make bash act as if invoked as a login shell
Also in future these are the standard bash config files
/etc/profile
~/.bash_profile or ~/.bash_login or ~/.profile
~/.bash_logout
~/.bashrc
More info: http://www.heimhardt.com/htdocs/bashrcs.html
A bit late to the party, but I was having the same problem (trying to find where the "l." command was aliased in RHEL6), and ended up in a place not mentioned in the previous answers. It may not be found in all bash implementations, but if the /etc/profile.d/ directory exists, try grepping there for unexplained aliases. That's where I found:
[user#server ~]$ grep l\\. /etc/profile.d/*
/etc/profile.d/colorls.csh:alias l. 'ls -d .*'
/etc/profile.d/colorls.csh:alias l. 'ls -d .* --color=auto'
/etc/profile.d/colorls.sh: alias l.='ls -d .*' 2>/dev/null
/etc/profile.d/colorls.sh:alias l.='ls -d .* --color=auto' 2>/dev/null
The directory isn't mentioned in the bash manpage, and isn't properly part of where bash searches for profile/startup info, but in the case of RHEL you can see the calling code within /etc/profile:
for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
if [ "${-#*i}" != "$-" ]; then
. "$i"
else
. "$i" >/dev/null 2>&1
fi
fi
done
Please do check custom installations/addons/plugins you have added, in addition to the .zshrc/.bashrc/.profile etc files
So for me: it was git aliased to 'g'.
$ which g
g: aliased to git
Then I ran the following command to list all aliases
$ alias
I found a whole lot of git related aliases that I knew I had not manually added.
This got me thinking about packages or configurations I had installed. And so went to the
.oh-my-zsh
directory. Here I ran the following command:
$ grep -r 'git' . |grep -i alias
And lo and behold, I found my alias in :
./plugins/git/git.plugin.zsh
I found the answer ( I had been staring at the correct file but missed the obvious ).
The aliases in my case are defined in the file ~/.bash_profile
Somehow this eluded me.
For more complex setups (e.g. when you're using a shell script framework like bash-it, oh-my-zsh or the likes) it's often useful to add 'alias mysql' at key positions in your scripts. This will help you figure out exactly when the alias is added.
e.g.:
echo "before sourcing .bash-it:"
alias mysql
. $HOME/.bash-it/bash-it.sh
echo "after sourcing bash:"
alias mysql
I think that maybe this is similar to what ghostdog74 meant however their command didn't work for me.
I would try something like this:
for i in `find . -type f`; do # find all files in/under current dir
echo "========"
echo $i # print file name
cat $i | grep "alias" # find if it has alias and if it does print the line containing it
done
If you wanted to be really fancy you could even add an if [[ grep -c "alias" ]] then <print file name>
The only reliable way of finding where the alias could have been defined is by analyzing the list of files opened by bash using dtruss.
If
$ csrutil status
System Integrity Protection status: enabled.
you won't be able to open bash and you may need a copy.
$ cp /bin/bash mybash
$ $ codesign --remove-signature mybash
and then use
sudo dtruss -t open ./mybash -ic exit 2>&1 | awk -F'"' '/^open/ {print substr($2, 0, length($2)-2)}'
to list all the files where the alias could have been defined, like
/dev/dtracehelper
/dev/tty
/usr/share/locale/en_CA.UTF-8/LC_MESSAGES/BASH.mo
/usr/share/locale/en_CA.utf8/LC_MESSAGES/BASH.mo
/usr/share/locale/en_CA/LC_MESSAGES/BASH.mo
/usr/share/locale/en.UTF-8/LC_MESSAGES/BASH.mo
/usr/share/locale/en.utf8/LC_MESSAGES/BASH.mo
/usr/share/locale/en/LC_MESSAGES/BASH.mo
/Users/user/.bashrc
/Users/user/.bash_aliases
/Users/user/.bash_history
...
Try: alias | grep name_of_alias
Ex.: alias | grep mysql
or, as already mentioned above
which name_of_alias
In my case, I use Oh My Zsh, so I put aliases definition in ~/.zshrc file.

Resources