-
Notifications
You must be signed in to change notification settings - Fork 198
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Resolve symlinks to find __origin #160
base: main
Are you sure you want to change the base?
Conversation
@@ -47,6 +47,7 @@ fi | |||
__dir="$(cd "$(dirname "${BASH_SOURCE[${__b3bp_tmp_source_idx:-0}]}")" && pwd)" | |||
__file="${__dir}/$(basename "${BASH_SOURCE[${__b3bp_tmp_source_idx:-0}]}")" | |||
__base="$(basename "${__file}" .sh)" | |||
__origin="$(cd "$(dirname "$(readlink -f "${BASH_SOURCE[${__b3bp_tmp_source_idx:-0}]}")")" && pwd)" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think one problem with this is that readlink isn't ubiquitously available like this https://stackoverflow.com/questions/1055671/how-can-i-get-the-behavior-of-gnus-readlink-f-on-a-mac
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you @kvz for pointing that out, and unwillingly throwing me into a rabbit hole with it 😉.
It seems with this restriction a one-liner solution cannot be achived. Could you imagine introducing a function like __readlink_f
for this functionality?
I challenged myself to write an equivalent using cd
, pwd -P
and readlink
, which should be available on all platforms. I got a lot right, but I'm struggling with relative symlinks. The function will not be very big, but ~100 lines it will be I guess.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I have been down that rabbit hole before, and i think it is a case where we should admit defeat unfortunately 😔
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I made it out the 🐇🕳️ again. I'm not sure how deep I went, but I would love to here what you think, if you find the time: rdlink.md (rename it back to sh)
I ran a lot of tests but only debian based newer OSs and only bash 3.2.57 and bash 5.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Very impressive! I'm happy to link to it in the README or even inline with the main template as a comment, but i don't think we can inline as much code with the template for this use case, i do apologize about that
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
but i don't think we can inline as much code with the template for this use case, i do apologize about that
Please don't apologize. I totally get that.
What do you think about adding it to the src
directory? Let me add a reference in the script to where it actually lives and I could make another PR. But I'm still a little hesitant because I don't really know if it performs under OSX or busybox.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
yeah we should first test it on osx and such. but if you don't mind, you could open the pr, we keep it pending for a bit while we spot issues on different systems, and then decide?
I propose another magic variable
__origin
which can be used for all dependencies. It would be the same as__dir
except when called via symlink.Context
I usually place bash scripts in
/opt/myscript/myscript.sh
and use aliases. But if they are of good use to other users I would like to create a symlink to/usr/local/bin/myscript
. Here I noticed that__dir
would give me the directory of the symlink rather the one from the origin/opt/myscript
. One may or may not have some dependencies at the origin which would not be found.I read some time about the usage of
realpath
vsreadlink -f
, where my conclusion for now is to stick with readlink.Example
cd /opt && git clone https://github.com/kvz/bash3boilerplate.git
LOG_LEVEL=7 /opt/bash3boilerplate/main.sh -f testp
ln -s /opt/bash3boilerplate/main.sh /opt/run
LOG_LEVEL=7 /opt/run -f testp
Before the change
After the change
LOG_LEVEL=7 /opt/run -f testp