Is it possible to export a bash function so that it will automatically enable extglob?
I have a bash function that uses some extglob which, if used in a shell with extglob disabled, fails to parse and throws a syntax error.
In the file containing the function source code I include a
shopt -s extglob
before the function is defined so that when the file is sourced extglob is enabled before the function is defined. But, if you export the function you only get the function, not the stuff before it. And any new bash shells will try and source the exported functions on startup.
In practice, this means that if I export my function, any future invocations of `/usr/bin/bash` that dont include `-O extglob` will print an error message to screen. This happens regardless if the bash shell being started is actually calling the exported function. It still runs if that exported function isnt used (since the error is that it cant parse the function), but is annoying nonetheless.
One specific annoyance with this that I use hyperfine to benchmark this function. the way hyperfine bootstraps the shells it runs, you can either use `--shell=bash` and itll use exported functions but wont have extglob, or you can use `--shell='/usr/bin/bash -O extglob'` to get extglob but you lose access to exported functions. You can use the ladder and then source the file defining the function and then run a the function, but then it skews the benchmarking times since you are timing how long it takes to source the function as well as timing the function runtime itself.
***
At any rate, does anyone know a trick so that exported functions that use extglob will parse correctly in a bash shell that doesnt explcitly enable extglob by being spawned via `bash -O extglob [...]`???
https://redd.it/1eqfzag
@r_bash
I have a bash function that uses some extglob which, if used in a shell with extglob disabled, fails to parse and throws a syntax error.
In the file containing the function source code I include a
shopt -s extglob
before the function is defined so that when the file is sourced extglob is enabled before the function is defined. But, if you export the function you only get the function, not the stuff before it. And any new bash shells will try and source the exported functions on startup.
In practice, this means that if I export my function, any future invocations of `/usr/bin/bash` that dont include `-O extglob` will print an error message to screen. This happens regardless if the bash shell being started is actually calling the exported function. It still runs if that exported function isnt used (since the error is that it cant parse the function), but is annoying nonetheless.
One specific annoyance with this that I use hyperfine to benchmark this function. the way hyperfine bootstraps the shells it runs, you can either use `--shell=bash` and itll use exported functions but wont have extglob, or you can use `--shell='/usr/bin/bash -O extglob'` to get extglob but you lose access to exported functions. You can use the ladder and then source the file defining the function and then run a the function, but then it skews the benchmarking times since you are timing how long it takes to source the function as well as timing the function runtime itself.
***
At any rate, does anyone know a trick so that exported functions that use extglob will parse correctly in a bash shell that doesnt explcitly enable extglob by being spawned via `bash -O extglob [...]`???
https://redd.it/1eqfzag
@r_bash
Reddit
From the bash community on Reddit
Explore this post and more from the bash community
Formatting and mounting a flash drive via the terminal, not the UI
I'm issuing the following commands to format a 512GB flash drive:
The output from the last command indicates that the flash drive was successfully formatted. How can I mount that device w/o having to select the device in the file explorer? I'd like to accomplish this using only the terminal.
https://redd.it/1eqgrco
@r_bash
I'm issuing the following commands to format a 512GB flash drive:
sudo fdisk -l # fetch device ID (/dev/sdc1)sudo umount /dev/sdc1sudo mkfs.exfat -n USB-256GB /dev/sdc1The output from the last command indicates that the flash drive was successfully formatted. How can I mount that device w/o having to select the device in the file explorer? I'd like to accomplish this using only the terminal.
https://redd.it/1eqgrco
@r_bash
Reddit
From the bash community on Reddit
Explore this post and more from the bash community
argc - Top-tier utility/framework for creating shell noscripts
https://github.com/sigoden/argc
I’m not the author. Whoever it is, they are a bloody legend!
Figured I would share it as it deserves way more love.
https://redd.it/1eqvgj4
@r_bash
https://github.com/sigoden/argc
I’m not the author. Whoever it is, they are a bloody legend!
Figured I would share it as it deserves way more love.
https://redd.it/1eqvgj4
@r_bash
GitHub
GitHub - sigoden/argc: A Bash CLI framework, also a Bash command runner.
A Bash CLI framework, also a Bash command runner. Contribute to sigoden/argc development by creating an account on GitHub.
How to learn shell noscripting?
I have basic / intermediate knowledge of command line and would like to learn how to use shell noscripting. Are there websites or resources that provide problems that I can try and solve? I am also interested in shell noscripts for HPC so I was wondering what area I should focus on here.
https://redd.it/1erft7a
@r_bash
I have basic / intermediate knowledge of command line and would like to learn how to use shell noscripting. Are there websites or resources that provide problems that I can try and solve? I am also interested in shell noscripts for HPC so I was wondering what area I should focus on here.
https://redd.it/1erft7a
@r_bash
Reddit
From the bash community on Reddit
Explore this post and more from the bash community
What does - and -- mean in bash?
I've come across noscripts that use - or -- for arguments and it's never really explained what they do. What's it called and what's the usage?
https://redd.it/1erzyy6
@r_bash
I've come across noscripts that use - or -- for arguments and it's never really explained what they do. What's it called and what's the usage?
# example using -
curl -fsSL 'some_url/install.sh' | env ENV="${HOME}/.bashrc" bash -
# example using --
command -- arg1 arg2
https://redd.it/1erzyy6
@r_bash
Reddit
From the bash community on Reddit
Explore this post and more from the bash community
Using read -p to prompt bold variable with ANSI escape codes?
Hi,\
As the noscript, I was wondering if it is possible to do it.\
I've tried 1
The output is what I desired, candy and yes are bold.\
I've tried 2
It output $var, not candy,\
\
I'd like something similar to second options, that way I can easily make a new line using '\n'. 3\
Is there any better solution? Or better using
~~I mean
https://redd.it/1es3gp5
@r_bash
Hi,\
As the noscript, I was wondering if it is possible to do it.\
I've tried 1
var=candy
bold=$(tput bold)
normal=$(tput sgr0)
read -p "IS ${bold}$var${normal} correct? " ans
# assuming answer yes
printf "Your answer is \033[1m%s\033[0m." "$ans"
The output is what I desired, candy and yes are bold.\
I've tried 2
var=candy
read -rep $'Is \033[1m$var\033[0m correct?' ans
printf "Your answer is \033[1m%s\033[0m." "$ans"
It output $var, not candy,\
\
I'd like something similar to second options, that way I can easily make a new line using '\n'. 3\
Is there any better solution? Or better using
printf and read separately. Something likeprintf "Is \033[1m%s\033[0m correct?" "$var"
read ans
printf "Your answer is \033[1m%s\033[0m." "$ans"
~~I mean
read -p is not supported in every shell, maybe it's a good habit to not use -p.~~https://redd.it/1es3gp5
@r_bash
Stack Overflow
How does one output bold text in Bash?
I'm writing a Bash noscript that prints some text to the screen:
echo "Some Text"
Can I format the text? I would like to make it bold.
echo "Some Text"
Can I format the text? I would like to make it bold.
Configuration in bash?
I have this piece of code in Python:
URLVARIANTS = {
'barstool': {
'baseurl': 'mcepl@shell.eng.rdu.redhat.com:publichtml/',
'targeturl': 'http://file.rdu.redhat.com/~mcepl/',
'shortenapi': 'https://url.corp.redhat.com/new?'
},
'wotan': {
'baseurl': 'wotan:Export/',
'targeturl': 'https://w3.suse.de/~mcepl/'
},
'tmp': {
'baseurl': 'fedorapeople.org:publichtml/tmp/',
'targeturl': 'https://mcepl.fedorapeople.org/tmp/',
# 'shortenapi': 'http://is.gd/create.php?format=simple&url='
'shortenapi': 'https://da.gd/s?url='
}
}
curconf = URLVARIANTSsite
# now I am using curconf['baseurl'] etc.
How to rewrite it in bash? Yes, I know about https://linuxsimply.com/bash-noscripting-tutorial/array/array-of-arrays/ but the whole is so incredibly finicky and crazy, that I haven’t managed to pull it off (could somebody rewrite this example in the pure sh/bash?). The only alternative I could come up with is to make
Any thoughts?
https://redd.it/1esg0b3
@r_bash
I have this piece of code in Python:
URLVARIANTS = {
'barstool': {
'baseurl': 'mcepl@shell.eng.rdu.redhat.com:publichtml/',
'targeturl': 'http://file.rdu.redhat.com/~mcepl/',
'shortenapi': 'https://url.corp.redhat.com/new?'
},
'wotan': {
'baseurl': 'wotan:Export/',
'targeturl': 'https://w3.suse.de/~mcepl/'
},
'tmp': {
'baseurl': 'fedorapeople.org:publichtml/tmp/',
'targeturl': 'https://mcepl.fedorapeople.org/tmp/',
# 'shortenapi': 'http://is.gd/create.php?format=simple&url='
'shortenapi': 'https://da.gd/s?url='
}
}
curconf = URLVARIANTSsite
# now I am using curconf['baseurl'] etc.
How to rewrite it in bash? Yes, I know about https://linuxsimply.com/bash-noscripting-tutorial/array/array-of-arrays/ but the whole is so incredibly finicky and crazy, that I haven’t managed to pull it off (could somebody rewrite this example in the pure sh/bash?). The only alternative I could come up with is to make
URL_VARIANTS a string contain JSON object, and then to use jq to separate requested values, but that sounds as a potential PITA as well.Any thoughts?
https://redd.it/1esg0b3
@r_bash
how do i alias cowsay?
hello, i would like to take the command "cowsay" and alias so every time i type in "endvideo" into the terminal the cowsay command pops up and spits out
"like comment share and subscribe!"
how would i do this?
thank you
https://redd.it/1etti1j
@r_bash
hello, i would like to take the command "cowsay" and alias so every time i type in "endvideo" into the terminal the cowsay command pops up and spits out
"like comment share and subscribe!"
how would i do this?
thank you
https://redd.it/1etti1j
@r_bash
Reddit
From the bash community on Reddit
Explore this post and more from the bash community
Limit developers from running a command in command line in a project
We have a fresh Cloudflare worker Typenoscript project in which we currently use wrangler deploy --production command to deploy to production worker.
We want to disable using that command locally and enable it only on the CI/CD pipeline (Github Actions). The problem is that Cloudflare doesn't offer any kind of permissions to do that, except fully limitting developers from accessing Cloudflare by deleting their accounts, and obviously we don't want to do that.
Is there a way of using a bash noscript to accomplish this? And have that noscript fully executable for any developer who would have it locally in the project (git commited to the repository)?
I am fairly new to bash, so I'm not even sure I asked the right question, but I'd say you get the jist.
Also we are open to any other ideas to accomplish this.
Thanks
https://redd.it/1etywgb
@r_bash
We have a fresh Cloudflare worker Typenoscript project in which we currently use wrangler deploy --production command to deploy to production worker.
We want to disable using that command locally and enable it only on the CI/CD pipeline (Github Actions). The problem is that Cloudflare doesn't offer any kind of permissions to do that, except fully limitting developers from accessing Cloudflare by deleting their accounts, and obviously we don't want to do that.
Is there a way of using a bash noscript to accomplish this? And have that noscript fully executable for any developer who would have it locally in the project (git commited to the repository)?
I am fairly new to bash, so I'm not even sure I asked the right question, but I'd say you get the jist.
Also we are open to any other ideas to accomplish this.
Thanks
https://redd.it/1etywgb
@r_bash
Reddit
From the bash community on Reddit
Explore this post and more from the bash community
Any tricks to not have to escape a quote?
I have a pretty lengthy cURL that looks something like this:
--data '{
"denoscription": "Foo",
"expression": "this is csdude\'s, it has \"this\", \"that\", and \"the other thing\""
}'
The real one is much longer; the longest is about 3800 characters, and there are 5 of them called in the bash noscript.
For the sake of easier coding and minimizing typos, is there a way to NOT have to escape all of the inner quotes?
I tried surrounding it with `, but that just threw an error :-/
https://redd.it/1eu9je9
@r_bash
I have a pretty lengthy cURL that looks something like this:
--data '{
"denoscription": "Foo",
"expression": "this is csdude\'s, it has \"this\", \"that\", and \"the other thing\""
}'
The real one is much longer; the longest is about 3800 characters, and there are 5 of them called in the bash noscript.
For the sake of easier coding and minimizing typos, is there a way to NOT have to escape all of the inner quotes?
I tried surrounding it with `, but that just threw an error :-/
https://redd.it/1eu9je9
@r_bash
Reddit
From the bash community on Reddit
Explore this post and more from the bash community
More fun with jq, getting results into a usable array
I'm using this in a cURL to get the data from `result[]`:
foo=$(curl --request GET \
--silent \
--url https://example.com \
--header 'Content-Type: application/json' | jq -r '.result[]')
When I print $foo, this is what I have:
[key]
default
firewall_custom
zone
34
[
{
"id": "example",
"version": "6",
"action": "block",
"expression": "lorem",
"denoscription": "ipsum",
"last_updated": "2024-08-15T19:10:24.913784Z",
"ref": "example",
"enabled": true
},
{
"id": "example2",
"version": "7",
"action": "block",
"expression": "this",
"denoscription": "that",
"last_updated": "2024-08-15T19:10:24.913784Z",
"ref": "example2",
"enabled": true
}
]
What I need from this is to create a loop where, in a series of addtional cURLs, I can insert action, expression, and denoscription.
I'm imagining that I would push these to 3 separate arrays (action, expression, and denoscription), so that ${action\[0\]} would coincide with ${expression\[0\]} and ${denoscription\[0\]}, and so on.
Something along the lines of:
# assuming that I have somehow created the following arrays:
# action=("block" "block")
# expression=("lorem" "this")
# denoscription=("ipsum" "that")
for x in ${action[@]}; do
bar=$(curl --request GET \
--silent \
--url https://example.com \
--data '{
"action": ${action[$x]},
"expression": ${expression[$x]},
"denoscription": ${denoscription[$x]}
}' | jq '.success')
if [[ $bar == true ]]
then
printf "$x succeeded\n"
else
printf "$x failed\n"
fi
# reset bar
bar=''
done
The question is, how to create action, expression, and denoscription arrays from the results of $foo (that original cURL)?
https://redd.it/1euba4a
@r_bash
I'm using this in a cURL to get the data from `result[]`:
foo=$(curl --request GET \
--silent \
--url https://example.com \
--header 'Content-Type: application/json' | jq -r '.result[]')
When I print $foo, this is what I have:
[key]
default
firewall_custom
zone
34
[
{
"id": "example",
"version": "6",
"action": "block",
"expression": "lorem",
"denoscription": "ipsum",
"last_updated": "2024-08-15T19:10:24.913784Z",
"ref": "example",
"enabled": true
},
{
"id": "example2",
"version": "7",
"action": "block",
"expression": "this",
"denoscription": "that",
"last_updated": "2024-08-15T19:10:24.913784Z",
"ref": "example2",
"enabled": true
}
]
What I need from this is to create a loop where, in a series of addtional cURLs, I can insert action, expression, and denoscription.
I'm imagining that I would push these to 3 separate arrays (action, expression, and denoscription), so that ${action\[0\]} would coincide with ${expression\[0\]} and ${denoscription\[0\]}, and so on.
Something along the lines of:
# assuming that I have somehow created the following arrays:
# action=("block" "block")
# expression=("lorem" "this")
# denoscription=("ipsum" "that")
for x in ${action[@]}; do
bar=$(curl --request GET \
--silent \
--url https://example.com \
--data '{
"action": ${action[$x]},
"expression": ${expression[$x]},
"denoscription": ${denoscription[$x]}
}' | jq '.success')
if [[ $bar == true ]]
then
printf "$x succeeded\n"
else
printf "$x failed\n"
fi
# reset bar
bar=''
done
The question is, how to create action, expression, and denoscription arrays from the results of $foo (that original cURL)?
https://redd.it/1euba4a
@r_bash
Reddit
From the bash community on Reddit
Explore this post and more from the bash community
Tab-completion for a command name
I have two custom commands:
For example:
$ play<TAB>
play-music play-video
$ play-vi<TAB>
play-video
I’ve found a tutorial on creating a bash-completion noscript, but it only works for command arguments. How can I achieve this for the command names themselves?
https://redd.it/1eugy51
@r_bash
I have two custom commands:
play-music and play-video. I want to write a bash noscript that allows me to autocomplete these commands when I press TAB. For example:
$ play<TAB>
play-music play-video
$ play-vi<TAB>
play-video
I’ve found a tutorial on creating a bash-completion noscript, but it only works for command arguments. How can I achieve this for the command names themselves?
https://redd.it/1eugy51
@r_bash
iridakos
Creating a bash completion noscript
A tutorial for adding tab completion to your noscripts using the Bash Programmable Completion functionality.
what is an "option" in bash? and how is it different the other arguments?
so i understand what an argument is, i understand that an option is a type of argument,
but what i don't understand is how an option is different then other types of arguments
can someone explain it to me?
thank you
https://redd.it/1eujcim
@r_bash
so i understand what an argument is, i understand that an option is a type of argument,
but what i don't understand is how an option is different then other types of arguments
can someone explain it to me?
thank you
https://redd.it/1eujcim
@r_bash
Reddit
From the bash community on Reddit
Explore this post and more from the bash community
Bashtutor - interactive bash tutorial
I wrote a minimal framework for creating CLI obstacle courses.
Currently there is one "module" which is for Bash itself.
While its a proof of concept, I attempted to make it entertaining and smoothen the edges as much as I could.
The main inspiration was vimtutor and how I would have liked something like this back when I was starting out.
https://github.com/agvxov/bashtutor
I'm hoping it will be useful to someone somewhere.
https://redd.it/1ev6ex5
@r_bash
I wrote a minimal framework for creating CLI obstacle courses.
Currently there is one "module" which is for Bash itself.
While its a proof of concept, I attempted to make it entertaining and smoothen the edges as much as I could.
The main inspiration was vimtutor and how I would have liked something like this back when I was starting out.
https://github.com/agvxov/bashtutor
I'm hoping it will be useful to someone somewhere.
https://redd.it/1ev6ex5
@r_bash
GitHub
GitHub - agvxov/bashtutor: Easily extendable utility to interactively showcase or teach CLIs, command line tasks, workflows and…
Easily extendable utility to interactively showcase or teach CLIs, command line tasks, workflows and Bash itself. - agvxov/bashtutor
I have written some helper noscripts to simplify on-demand GNU/Linux proxy configuration
https://gitlab.com/brlin/linux-proxy-configuration-helper
https://redd.it/1ev7j98
@r_bash
https://gitlab.com/brlin/linux-proxy-configuration-helper
https://redd.it/1ev7j98
@r_bash
GitLab
林博仁 Buo-ren Lin / Linux proxy configuration helper · GitLab
Helper noscripts to assist in configuring proxy settings on a GNU/Linux desktop.
Interpolation and sed!
I hope this helps somebody, like it did for myself, last week.
I love this shit. And I am always happy to share/ read contructive critiscism.
I got tasked with a set of instructions, under immense pressure, the other day.
I needed to edit a 20k line file, and was told it needed batching into many, 100 line files, to avoid deadlocking our DB whilst running the finished article. In total, we were deleting millions of duplicate rows, with specific IDs. I also needed to add a comma, at the end of each newline (so far, no sweat). So I did
I then batched that file, into many smaller ones, running
But, after I had done this, I discovered that I also needed to remove the very last comma in each file. This is so that the syntax is accepted by MySQL. So I did -
Then, here's the interpolation... courtesy of my wise and all-knowing colleague, who just happened to shoot me a message, making sure I was ok. I was stuck on how to run the MySQL statement, using the content in all my files. I was also very nervous, at this point. We ended up writing,
I felt very accomplished, as I always do when I learn something new, and needed a little nudge to get over the line, in the end. But my goodness, it was such a rush! I hope someone finds this useful and/ or interesting. I know I did.
https://redd.it/1evju1s
@r_bash
I hope this helps somebody, like it did for myself, last week.
I love this shit. And I am always happy to share/ read contructive critiscism.
I got tasked with a set of instructions, under immense pressure, the other day.
I needed to edit a 20k line file, and was told it needed batching into many, 100 line files, to avoid deadlocking our DB whilst running the finished article. In total, we were deleting millions of duplicate rows, with specific IDs. I also needed to add a comma, at the end of each newline (so far, no sweat). So I did
for i in x*; do cat "$i" | tr \\n , >> $i.new;I then batched that file, into many smaller ones, running
split -l 100 FILE.txt. The newly created batched files then had naming conventions like, `xaa.new`, `xab.new` etc.But, after I had done this, I discovered that I also needed to remove the very last comma in each file. This is so that the syntax is accepted by MySQL. So I did -
for i in x*; do sed -e '$s/,$//' "$i" > "$i".new.Then, here's the interpolation... courtesy of my wise and all-knowing colleague, who just happened to shoot me a message, making sure I was ok. I was stuck on how to run the MySQL statement, using the content in all my files. I was also very nervous, at this point. We ended up writing,
for i in x*; do mysql databaseName -vvv -e "DELETE from table where table_id in ($(cat $i))" >> /home/userName/incidentNumber/output.sql after we had tested SELECT statements, echo'ing output (without any MySQL) and had it approved by all stakeholders.I felt very accomplished, as I always do when I learn something new, and needed a little nudge to get over the line, in the end. But my goodness, it was such a rush! I hope someone finds this useful and/ or interesting. I know I did.
https://redd.it/1evju1s
@r_bash
mirror one GNU Screen session to another?
I'd like to create two screen sessions, then mirror the activity of one to another. So, if I create
Is this possible using functionality built into screen, or would if be more complicated? I can't find anything about this online, so I'm guessing it's the latter.
https://redd.it/1evp3t5
@r_bash
I'd like to create two screen sessions, then mirror the activity of one to another. So, if I create
session_1 in one Terminal window, and create session_2 in another Terminal window, they'd look the exact same if I ran a certain program in session_1. It'd also be nice if detaching session_1 detached session_2 as well.Is this possible using functionality built into screen, or would if be more complicated? I can't find anything about this online, so I'm guessing it's the latter.
https://redd.it/1evp3t5
@r_bash
Reddit
From the bash community on Reddit
Explore this post and more from the bash community
Trap not taking effect in POSIX noscript
In this noscript I launch vim opening a temp file in the terminal window. If the terminal window is closed with vim running, the temp file should be deleted. Closing the terminal window should also kill vim process.
However, closing the terminal window doesn't remove the file and the vim process lingers when the terminal window is closed. If I remove the
Any ideas? I have
https://redd.it/1evoe9l
@r_bash
In this noscript I launch vim opening a temp file in the terminal window. If the terminal window is closed with vim running, the temp file should be deleted. Closing the terminal window should also kill vim process.
However, closing the terminal window doesn't remove the file and the vim process lingers when the terminal window is closed. If I remove the
trap command, then the vim process will terminate as expected but the temp file will of course remain.Any ideas? I have
exec sh -c because for some reason without it, vim process lingers when its terminal window closes.https://redd.it/1evoe9l
@r_bash