Skip to content

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

__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