Skip to content
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

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open

Conversation

efelon
Copy link

@efelon efelon commented Mar 16, 2022

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 vs readlink -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

2022-03-16 15:56:24 UTC [ info] __i_am_main_script: 1
2022-03-16 15:56:24 UTC [ info] __file: /opt/bash3boilerplate/main.sh
2022-03-16 15:56:24 UTC [ info] __dir: /opt/bash3boilerplate
2022-03-16 15:56:24 UTC [ info] __base: main

ln -s /opt/bash3boilerplate/main.sh /opt/run

LOG_LEVEL=7 /opt/run -f testp

Before the change

2022-03-16 15:53:40 UTC [ info] __i_am_main_script: 1
2022-03-16 15:53:40 UTC [ info] __file: /opt/run
2022-03-16 15:53:40 UTC [ info] __dir: /opt
2022-03-16 15:53:40 UTC [ info] __base: run

After the change

LOG_LEVEL=7 /opt/run -f testp

2022-03-16 16:47:40 UTC [ info] __i_am_main_script: 1
2022-03-16 16:47:41 UTC [ info] __file: /opt/run
2022-03-16 16:47:41 UTC [ info] __dir: /opt
2022-03-16 16:47:41 UTC [ info] __base: run
2022-03-16 16:47:41 UTC [ info] __origin: /opt/bash3boilerplate

@@ -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)"
Copy link
Owner

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

Copy link
Author

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.

Copy link
Owner

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 😔

Copy link
Author

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.

Copy link
Owner

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

Copy link
Author

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.

Copy link
Owner

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?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants