What is these read command doing? Not understanding the encsig and enckey lines
Struggling to understand how the license key variable is being parsed by this code.
​
# Prompt for license key
echo -ne "Please enter a license key: "
read signedlicensekey
# Parse the license key
read -r signingdata encsig <<<$(echo "$signedlicensekey" | tr "." " ")
read -r signingprefix enckey <<<$(echo "$signingdata" | tr "/" " ")
From my understanding its license, then taking that data and to change any periods found into spaces. This then sets a new variable with the format modified to remove "." characters and saves it as signing\data.
What is "enc_sig" doing? also the next line for enc_key? Doesn't appear to be setting that as a viarable as I print it and nothing appears. Thanks!
https://redd.it/1b2ndmn
@r_bash
Please critique my work
Hello
I wrote this script in 5 days and I am finally happy with it. It does everything I want. This is the first time I have used functions() in a bash script. I would like if you guys could rate it and give some suggestions. Please be direct and harsh. What could have I done better, what is unnecessary and so on...
Yes I know #!/bin/env (insert any interpreter) exists. I dont want/need it.
Yes I know [shellcheck.net](https://shellcheck.net) exists and I have used it.
Yes I have used chatgpt/gemini/bard for some help.
Yes I have used shfmt -s.
So the script is actually only for polybar. It will display a music status bar with current playback time, duration, artist and title. If title is too long, it will make the text slide from right to left. I also had to differ between Firefox and other players because Firefox sadly doesn't support the MPRIS API fully.
Below is my bash script, or if you like pastebin more -> [Pastebin Bash Script](https://pastebin.com/Vc5vJgc4)
#!/bin/bash
###################################################################
#Script Name :music_bar
#Description :polybar module for displaying music bar
#Args :
#Author :unixsilk
#Email :
###################################################################
function check_if_something_plays() {
no_player=$(playerctl status 2>&1)
if [ "${no_player}" == "No players found" ]; then
exit # Exit the entire script without any further output
fi
}
check_if_something_plays
find_playing_player() {
for each_player in $(playerctl -l); do
status=$(playerctl -p "${each_player}" status)
if [ "${status}" == "Playing" ]; then
player="${each_player}"
break
else
exit
fi
done
}
find_string_length() {
grab_artist=$(playerctl -p "${player}" metadata artist)
grab_title=$(playerctl -p "${player}" metadata title)
combined_length=$((${#grab_artist} + ${#grab_title}))
if [[ ${combined_length} -ge 55 ]]; then
length="greater"
else
length="lesser"
fi
}
function set_timestamps() {
current_duration=$(playerctl -p "${player}" metadata --format '{{duration(position)}}')
total_duration=$(playerctl -p "${player}" metadata --format '{{duration(mpris:length)}}')
}
function print_firefox_bar_moving() {
title_string_length=${#grab_title}
counter=0
for ((each = 0; each <= title_string_length; each++)); do
echo -e "${begin_white}""" "${grab_artist:0:15}" "•" "${end_color}""${grab_title:counter:55}"
((counter++))
sleep 0.19
done
}
function print_firefox_bar_static() {
echo "${begin_white}""" "${grab_artist}" "•" "${end_color}""${grab_title}"
}
function print_other_player_bar_moving() {
title_string_length=${#grab_title}
counter=0
for ((each = 0; each <= title_string_length; each++)); do
set_timestamps
echo -e "${begin_yellow}""${current_duration}""/""${total_duration}" "${begin_white}""" "${grab_artist:0:15}" "•" "${end_color}""${grab_title:counter:40}"
((counter++))
sleep 0.19
done
}
function print_other_player_bar_static() {
echo -e "${begin_yellow}""${current_duration}""/""${total_duration}" "${end_color}""${begin_white}""" "${grab_artist:0:9}" "•" "${end_color}""${grab_title}"
}
function define_colors() {
begin_yellow="%{F#F0C674}"
begin_white="%{F#FFFFFF}"
end_color="%{F-}"
}
#Find which player is playing currently and define that as variable $player
find_playing_player
#find the string length of title and artist
find_string_length
#invoke ANSI colors for Polybar
define_colors
combine_values="${player}-${length}"
case "${combine_values}" in
firefox*-greater)
How would you implement "deleting duplicate files" in a CLI file de-duplication tool?
This is more a request for what concepts/ideas might work than for specific technical assistance, but if you know of any tools that might make some aspect much easier do suggest it.
***
### dupefind
Im currently working on a [tool called dupefind to find duplicate files and de-duplicate them](https://github.com/jkool702/forkrun/blob/dupefind/dupefind.bash). It is being designed explicitly to heavily utilize my [forkrun](https://github.com/jkool702/forkrun/blob/dupefind/forkrun.bash) utility.
So far I have the "finding duplicate files" part up and running and Im fairly happy with it (see bottom of post for more info). But, Im trying to figure out a good set of methods for choosing which duplicate(s) to keep that would work in a terminal (no GUI) and could handle 10 or 1,000 or 100,000 sets of duplicates.
***
### current plan
Currently, Im thinking more-or-less the following feature set. Am I missing any really useful features? Do any of these seem not useful / more trouble than they're worth?
global options:
* option to re-link deleted duplicates to the one duplicate that was kept (so that all the duplicate files still exist, but all except 1 are hard/soft-links)
* option to remove dirs that had all their contents deleted and are now empty
* option to save a duplicate file list and the ability to later resume from that duplicate list without needing to rescan the system for duplicates
* number of duplicates to keep (call it `N`)
modes of operation:
* manual: go 1 set of duplicates at a time, have them interactively select which
one(s) to keep via `read` or `select`
* automatic (with final manual confirmation): set up a heirarchical decision tree classification system based. (see below for details)
Does this seem reasonable and feasible and diverse enough to be useful for most de-duplicating situations? Any major features other de-duplicators have that I missed?
NOTE: In the future I might add "fuzzy matching" specialty modes for things like pictures and music, but for the moment Im just focusing on exact duplicates.
Thanks in advance for your feedback!
***
### heirarchical decision tree classification system
The idea is you could define certain aspects such as
* glob-enabled name/path (or not name/path)
* file age
* length of name (basename or full path)
* owner (user/group)
and then list them in a priority list to automatically figure out which duplicates to keep. For example, the idea is that the user would (probably in a config file) define something like
# priority to keep (highest on top, lowest on bottom)
path=/home/"$USER"/*
path!=/tmp/* && path!=/run
owner=$USER
age=newest
length_name=shortest
Then for each duplicate group, to figure out which `N` duplicates to keep, it would:
check how many were under `/home/$USER`. say there were `M`.
* if `M=N`: we are done, keep those `M`.
* if `M>N`: it would take those `M` and check them for the next lower priority on the list, looking for which `N` to keep
* if `M<N`: Those M would be kept (if M=0 none are kept yet), and the remaining would be checked for the next lower priority for which `N-M` to keep.
And this decision tree repeats at each priority level until you find your N duplicates or you finish with the last/lowest priority level defined.
***
### duplicate file finding code
The duplicate file finding code uses a 2-pass approach - first finding files that have the same size (as listed by `du`) and then computing the `sha1sum` of all the files with non-unique size and then lists any files with the same size *and* the same `sha1sum`.
for performance: on my system's main drive there is in total about 63 GB of data split between around 1.7 million files. There are around 600,000 duplicates, probably 90% of which are due to a backup copy of the entirety of `/usr` that is floating around for....reasons. `dupefind` generated a grouped list of duplicate files for the entire system in roughly 2 minutes and 10 seconds. This is about
Little trick to make tar silently use multithreaded compressors in interactive sessions
Install some MT compressors (package names as in ubuntu):
* bzip2: lbzip2
* gz: pigz
* lz: plzip
* xz: pixz
* zstd: zstd
Create `~/.local/bin.tar`. In the dir, symlink regular tools to MT ones:
cd ~/.local/bin.tar
ln -s /usr/bin/lbzip2 bzip2
ln -s /usr/bin/pigz gzip
ln -s /usr/bin/lzip.plzip lzip
ln -s /usr/bin/pixz xz
ln -s /usr/bin/zstdmt zstd
Add into your bash aliases:
alias tar='PATH=~/.local/bin.tar:$PATH tar'
Thats all!
**Pro tip**: tar is [aware](https://git.savannah.gnu.org/cgit/tar.git/tree/src/buffer.c#n330) of lbzip2 and uses it by default if regular bzip2 is not installed.
https://redd.it/1b1skq4
@r_bash
$PATH question...
In my .bashrc I've got several lines like the following:
export PATH="path/to/whatever:$PATH"
My question: Instead of starting each of those lines with export, if I just did:
PATH="this/path:$PATH
PATH="that/path:$PATH
export PATH
Is that basically the same thing?
https://redd.it/1b105ct
@r_bash
Confusion with Authentication header
It's told here that:
>For "Basic" authentication the credentials are constructed by first combining the username and the password with a colon (aladdin:opensesame), and then by encoding the resulting string in base64 (YWxhZGRpbjpvcGVuc2VzYW1l).
I created a request here to get all my gists, it looks like this: http -a ':<GitHub classic PAT>' GET
`https://api.github.com/gists` 'Accept:application/vnd.github+json' X-GitHub-Api-Version:2022-11-28
. For curl I got this code: curl --request GET --url https://api.github.com/gists --header 'Accept: application/vnd.github+json' --header 'Authorization: Basic <encrypted credentials>' --header 'X-GitHub-Api-Version: 2022-11-28'
I tried to do echo <GitHub classic PAT> | base64
to check whether it is equal to <encrypted credentials>
but they didn't. What am I missing? Why I got different result from <encrypted credentials>
after applying base64
to the original PAT?
https://redd.it/1b0u84y
@r_bash
_omb_prompt_underline_navy Pictures/ Videos/
echo_background_cyan KONSOLE_DBUS_SERVICE _omb_prompt_underline_olive PIPESTATUS VIRTUALENV_THEME_PROMPT_PREFIX
echo_background_green KONSOLE_DBUS_SESSION _omb_prompt_underline_purple .pki/ VIRTUALENV_THEME_PROMPT_SUFFIX
echo_background_orange KONSOLE_DBUS_WINDOW _omb_prompt_underline_red PLASMA_USE_QT_SCALING virtuoso/
echo_background_purple KONSOLE_VERSION _omb_prompt_underline_silver plugins .vscode/
echo_background_red LANG _omb_prompt_underline_teal POST_1_7_2_GIT WAYLAND_DISPLAY
echo_background_white LANGUAGE _omb_prompt_underline_white PPID white
echo_background_yellow LC_CTYPE _omb_prompt_underline_yellow PREVIEW WINDOWID
echo_black LESS OMB_PROMPT_VIRTUALENV_FORMAT PROFILEHOME .wine/
echo_blue LESSCLOSE _omb_prompt_white Projects/ XAUTHORITY
echo_bold_black LESSOPEN _omb_prompt_yellow PROMPT_COMMAND XCURSOR_SIZE
echo_bold_blue .librewolf/ _omb_spectrum_bg PROMPT_DIRTRIM XCURSOR_THEME
echo_bold_cyan LINENO _omb_spectrum_fg PS1 XDG_ACTIVATION_TOKEN
echo_bold_green LINES _omb_spectrum_fx PS2 XDG_CONFIG_DIRS
echo_bold_orange .local/ _omb_term_background_black PS4 XDG_CURRENT_DESKTOP
echo_bold_purple LOGNAME _omb_term_background_blue Public/ XDG_DATA_DIRS
echo_bold_red LS_COLORS _omb_term_background_brown purple XDG_RUNTIME_DIR
echo_bold_white LSCOLORS _omb_term_background_cyan PWD XDG_SEAT
echo_bold_yellow MACHTYPE _omb_term_background_gray PYTHON_THEME_PROMPT_PREFIX XDG_SEAT_PATH
echo_cyan MAILCHECK _omb_term_background_green PYTHON_THEME_PROMPT_SUFFIX XDG_SESSION_CLASS
echo_green MANAGERPID _omb_term_background_lime QSYS_ROOTDIR
__git_printf_supports_v _omb_prompt_blue _omb_term_underline_brown SCM_THEME_TAG_PREFIX
blue __git_push_recurse_submodules _omb_prompt_bold _omb_term_underline_cyan SDIRS
bold __git_quoted_cr _omb_prompt_bold_black _omb_term_underline_gray SECONDS
bold_black __git_rebase_inprogress_options _omb_prompt_bold_blue _omb_term_underline_green SESSION_MANAGER
bold_blue __git_rebase_interactive_inprogress_options _omb_prompt_bold_brown _omb_term_underline_lime SHELL
bold_cyan __git_ref_fieldlist _omb_prompt_bold_cyan _omb_term_underline_magenta SHELLOPTS
bold_green __git_revert_inprogress_options _omb_prompt_bold_gray _omb_term_underline_navy SHELL_SESSION_ID
bold_orange __git_send_email_confirm_options _omb_prompt_bold_green _omb_term_underline_olive SHLVL
bold_purple __git_send_email_suppresscc_options _omb_prompt_bold_lime _omb_term_underline_purple SHORT_HOST
bold_red __git_sequencer_inprogress_options _omb_prompt_bold_magenta _omb_term_underline_red SRANDOM
bold_white __git_showcurrentpatch _omb_prompt_bold_navy _omb_term_underline_silver .ssh/
bold_yellow __git_untracked_file_modes _omb_prompt_bold_olive _omb_term_underline_teal SSH_AGENT_LAUNCHER
.byobu/ __git_whitespacelist _omb_prompt_bold_purple _omb_term_underline_violet SSH_AUTH_SOCK
.cache/ __git_ws_error_highlight_opts _omb_prompt_bold_red _omb_term_underline_white .steam/
CDPATH GLOBIGNORE _omb_prompt_bold_silver _omb_term_underline_yellow SYSTEMD_EXEC_PID
CHRUBY_THEME_PROMPT_PREFIX .gnome/ _omb_prompt_bold_teal _omb_term_violet tan
CHRUBY_THEME_PROMPT_SUFFIX .gnupg/ _omb_prompt_bold_white _omb_term_white Templates/
CLOCK_CHAR_THEME_PROMPT_PREFIX .gradle/ _omb_prompt_bold_yellow _omb_term_yellow TERM
CLOCK_CHAR_THEME_PROMPT_SUFFIX green _omb_prompt_brown OMB_USE_SUDO THEME_BATTERY_PERCENTAGE_CHECK
CLOCK_THEME_PROMPT_PREFIX GROUPS _omb_prompt_cyan _omb_util_original_PS1 THEME_CLOCK_COLOR
CLOCK_THEME_PROMPT_SUFFIX GTK2_RC_FILES _omb_prompt_gray _omb_util_prompt_command
Help with ohmybash
After I installed oh my bash, I used some themes like agnoster for my bash and i started to code, but when I used command cd and pressed tab it said there's about 552 possiblities and there was at most 76 directories in my home directory including dotfiles .
this is the output after pressing tab key after cd
Display all 552 possibilities? (y or n)
_ echo_underline_red _NC _omb_term_blue reset
aliases echo_underline_white ncolors _omb_term_bold reset_color
.android/ echo_underline_yellow normal _omb_term_bold_black ret_status
Android/ echo_white .oh-my-bash/ _omb_term_bold_blue RVM_THEME_PROMPT_PREFIX
AndroidStudioProjects/ echo_yellow OLDPWD _omb_term_bold_brown RVM_THEME_PROMPT_SUFFIX
Applications/ EPOCHREALTIME _omb_bash_version _omb_term_bold_cyan SCM_CHECK
Arduino/ EPOCHSECONDS _omb_cd_dirstack _omb_term_bold_gray SCM_GIT
.arduino15/ EUID _omb_deprecate_blue _omb_term_bold_green SCM_GIT_AHEAD_CHAR
.arduinoIDE/ FG _omb_deprecate_const _omb_term_bold_lime SCM_GIT_BEHIND_CHAR
background_black .fltk/ _omb_deprecate_const_counter _omb_term_bold_magenta SCM_GIT_CHAR
background_blue FX _omb_deprecate_const_value _omb_term_bold_navy SCM_GIT_DETACHED_CHAR
background_cyan Games/ _omb_deprecate_declare _omb_term_bold_olive SCM_GIT_DISABLE_UNTRACKED_DIRTY
background_green Git/ _omb_deprecate_declare_counter _omb_term_bold_purple SCM_GIT_IGNORE_UNTRACKED
background_orange __git_all_commands _omb_deprecate_green _omb_term_bold_red SCM_GIT_SHOW_CURRENT_USER
background_purple __git_am_inprogress_options _omb_deprecate_magenta _omb_term_bold_silver SCM_GIT_SHOW_DETAILS
background_red __git_cherry_pick_inprogress_options _omb_deprecate_msg_please_use _omb_term_bold_teal SCM_GIT_SHOW_MINIMAL_INFO
background_white __git_cmds_with_parseopt_helper _omb_deprecate_red _omb_term_bold_violet SCM_GIT_SHOW_REMOTE_INFO
background_yellow __git_color_moved_opts _omb_deprecate_yellow _omb_term_bold_white SCM_GIT_STAGED_CHAR
_backup_glob
Pushd seems neglected
About half of all Bash users I talk to seems to know about pushd, but I know no one besides me who daily drives it. I guess the defaults are not the easiest thing to get used to, but with a few aliases (e.g. https://github.com/agvxov/cd\_rc.git) it seems a plain upgrade to regular cd-ing.
​
So, do you use it? Why/why not?
https://redd.it/1b067ck
@r_bash
how can i turn this 5 lines code into 4?(and i dont want to use && or ; ...
grep "Montréal" lundi | cut -d',' -f1,4 | sort > montreal_preferences
grep "banane" lundi | cut -d',' -f1,4 | sort > banane_preferences
cut -d',' -f1,3 mardi | sort > temperature_preferences
join -t',' -1 1 -2 1 montreal_preferences temperature_preferences | sort | grep ",chaud" | wc -l join -t',' -1 1 -2 1 banane_preferences temperature_preferences | sort | grep -v ",chaud" | wc -l
https://redd.it/1b021xa
@r_bash
Command working diffent in the shell than inside script.
Hello.
This command give to me my current public IP:
curl checkip.amazonaws.com
MyPublicIp
But if I try to use the same command inside a script or with a extra tool like awk in the command line, I get this extra output:
curl checkip.amazonaws.com | awk -F . '{print $1}'
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 15 100 15 0 0 110 0 --:--:-- --:--:-- --:--:-- 111
200
But I don't know how to get rid of that extra output, any ideas I will appreciated people, thanks!!!
​
https://redd.it/1azjfxj
@r_bash
bash automatic completion question: is there a way to programatically determine (from inside a script/function) what the completions would have been for some commandline?
Title mostly sums it up - id like to be able to figure out what completions would have been suggested for some (partial) command line had you typed it and hit tab twice, but from inside a (non-interactive) script/function.
I know you can get the completion that was used with a given command via `complete -p ${command}`, but I cant seem to figure out how to feed that a command line programatically and trigger having it give completions.
***
My use case is I am adding completions to my [forkrun](https://github.com/jkool702/forkrun/blob/main/forkrun/bash) utility. `forkrun` is fundamentally a function that runs other commands for you (in parallel), and so its commandline is structured
forkrun [<forkrun_options>] [--] <command> [<command_options>]
I have [autocompletion working for the `<forkrun options>` and for the `<command>` itself](https://github.com/jkool702/forkrun/blob/forkrun_autocompletion/forkrun.bash#L928), but for any remaining `<command_options>` I would like to generate the same completions as what would have been generated if someone had typed
<command> [<command_options>]
with a partially typed last option directly into the terminal and then hit tab twice.
Thanks in advance.
https://redd.it/1az5jsd
@r_bash
Multiple bash versions
I am working with a code. My Visual Studio Code has bash version 5 but when I run it, it runs with version 3. Even when I check from direct terminal, it says version 3. How to make it run with version 5 always?
https://redd.it/1ayug8u
@r_bash
I had some questions about setting up bash auto-completions (when you hit <TAB> twice) for a complicated shell function
Im trying to figure out how to set up auto-completions (where it will auto-complete on `<TAB>` if it can or bring up a list of possible completions on a 2nd `<TAB>`) for my [forkrun](https://github.com/jkool702/forkrun) utility, which runs code in parallel with syntax much like `xargs -P`.
Ive never worked with autocompletion nor readline, and while I think I could get something working for a fairly simple function I suspect that getting `forkrun'`'s auto-completion how Id like it is going to take some advanced bash auto-complete magic. There are 2 aspects that make setting up auto-completion for forkrun tricky:
***
TRICKY BIT #1: it requires options to be in the same general format as `xargs` where you have:
... | forkrun [forkrun_options] [--] command [command_options]
# NOTE: everything in `[...]` is optional
**Ideally, I would like it to:**
1. initially auto-complete forkrun options, then
2. for the first option that doesnt start with a `-` or `+` OR the option immediately after a '--' (whichever comes first) have it auto-complete commands, and then
3. for all remaining options do auto-completions for that command (should they be available)
***
TRICKY BIT #2: `forkrun` uses a limited degree or "fuzzy" option matching. Options are identified using a `while-->case` loop with extglob-based case conditions. In practice, this basically means that each hoption has several aliases. Currently, options passed to forkrun trigger 1 of 39 different possible (unique) code paths, but there are ~400 possible different inputs that can trigger them (i.e., on average each unique option codepath has ~10 aliases).
See [forkrun.bash - lines 40-210](https://github.com/jkool702/forkrun/blob/main/forkrun.bash#L40) for the specific extglob matching criteria, but *most* of the possible matches are shown in the below `echo` command. Each line corresponds to all the possible aliases for a single option.
**Ideally, I would want the auto-completion to only offer up 1 possible auto-completion from each option (whatever is the shortest completoin based on what is already typed)**.
For example, if someone types `forkrun -pip` and hits tab I want it to auto-complete to `-pipe`, not to show `-pipe` `-piperead` and `-pipe-read` as possible completions, since all those completions are aliases and they all trigger the exact same codepath
***
# options with arguments are accepted with either 1 or 2 leading dash ('-') characters. arguments can be passed as '-opt <arg>' or '-opt=arg'
# options without arguments (excluding the ones for displaying help) are accepted with either 1 or 2 leading dash ('-') and/or plus ('+') characters
# this applies to both the short (single-letter) and long option types. i.e., { '-o' '--opt' '--o' '-opt' } all work
# option takes an argument that can be passed via either:
# '-opt <arg>'' (2 inputs) --OR-- '--opt=<arg>' (1 input)
# the <arg> doesnt need to be auto-completed, but the option flag before it does.
echo -{,-}{j,P,nprocs}{,=} \
-{,-}{t,tmp,tmpdir}{,=} \
-{,-}l{,=} -{,-}{,n}line{,s}{,=} \
-{,-}L{,=} -{,-}{,N}LINE{,S}{,=} \
-{,-}{b,byte,bytes}{,=} \
-{,-}{B,BYTE,BYTES}{,=} \
-{,-}{d,delim,delimiter}{,=}
# option does NOT take an argument, and can be passed via either:
# '-opt' (enable option/flag) --OR-- '+opt' (disable option/flag)
echo {-,+}{,-,+}{i,insert} \
{-,+}{,-,+}{I,INSERT,INSERT-ID,INSERTID} \
{-,+}{,-,+}{k,keep,keeporder,keep-order} \
{-,+}{,-,+}{n,number,numberlines,number-lines} \
{-,+}{,-,+}{z,0,zero,null} \
{-,+}{,-,+}{s,subshell,sub-shell,sub-shell-run,subshell-run} \
{-,+}{,-,+}S {-,+}{,-,+}{S,s}tdin{,run,-run} \
{-,+}{,-,+}{p,pipe,piperead,pipe-read} \
{-,+}{,-,+}{D,Delete,delete} \
{-,+}{,-,+}{N,NO} {-,+}{,-,+}{N,n}{O,o}{,-}func \
{-,+}{,-,+}{u,unescape} \
{-,+}{,-,+}{v,,vv,vvv,vvvv,verbose}
# option displays help text on
print_firefox_bar_moving
;;
firefox*-lesser)
print_firefox_bar_static
;;
*-greater)
set_timestamps
print_other_player_bar_moving
;;
*-lesser)
set_timestamps
print_other_player_bar_static
;;
*)
exit
;;
esac
https://redd.it/1b2kzwb
@r_bash
1/5th as long as it took `fdupes` to do this.
# time { fdupes -r $(find / -maxdepth 1 -mindepth 1 | grep -vE 'DATA|sys|proc|dev|tmp|run') >/tmp/dupes-fdupes; }
real 10m24.062s
user 4m36.991s
sys 3m8.718s
# time { dupefind / -e \!/DATA >/tmp/dupes-dupefind; }
real 2m12.737s
user 14m22.523s
sys 12m12.109s
Granted `fdupes` is more "efficient" and has a fairly significant advantage in total CPU time, but (thanks to `forkrun`) `fdupes` is so much better at parallelizing its work that it still comes out way faster (in terms of "wall clock" time).
https://redd.it/1b1y6st
@r_bash
Changing my career to be a webdev
Hi, I am (27 - male) and I have a very basic working knowledge of HTML and CSS, but interested in learning more. Is it safe to switch my career to be a devops engineer, Willing to set aside 03 years to perfect myself at a handful of current technologies. I need your opinion and would be grateful if you could provide me with a roadmap and basic project documentation.
https://redd.it/1b1wgzn
@r_bash
Trouble with autocompletion : won't finish the word
Hello !
I am learning bash and I am trying to create a little script for my homelab. I would like to improve it with autocompletion.
It looks like this :
#!/bin/bash
# On vérifie si un nom de conteneur a été donné
if [ -z "$1" ]; then
echo "Usage: $0 <nom_conteneur>"
exit 1
fi
nom_conteneur="$1"
# Run docker exec -it on the specified container
docker exec -it "$nom_conteneur" /bin/bash
It is accompanied by an autocompletion script that looks like this :
#/usr/bin/env bash
source /usr/share/bash-completion/completions/docker
complete -F __docker_complete_container_names teleport
Which is simply calling for the autocompletion script that already exists in Docker, I thought it would be best if I simply used it :
__docker_complete_container_names() {
local containers=( $(__docker_q ps -aq --no-trunc) )
local names=( $(__docker_q inspect --format '{{.Name}}' "${containers[@]}") )
names=( "${names[@]#/}" ) # trim off the leading "/" from the container names
COMPREPLY=( $(compgen -W "${names[*]}" -- "$cur") )
}
The problem is that, when I type `teleport` and press "Tab", it gives me a list of containers :
teleporter-autoheal teleporter-dock teleporter-filebrowser teleporter-haproxy teleporter-proxy teleporter-squid teleporter-terminal teleporter-vpn teleporter-web1
And even helpfully adds a "teleporter-" after "teleport" ...but if I add another letter, for example "a" to narrow it down to `autoheal`, pressing tab again just gives me the entire list again instead of finishing the word.
What could be the problem in your opinion ?
Edit : If I use the normal docker exec -it command, the autocompletion doesn't stop in the middle
https://redd.it/1b1cn6q
@r_bash
i want to write a script to pass a file through commands, point me in the right direction?
i apologize if im using the wrong language, im an extreme noob and trying to learn.
what i want is a script that allows me to compile kotlin files without hassle. currently to compile them through the command line i have to run
kotlinc [name of file].kt -include-runtime -d [name of file].jar
java -jar [name of file]
BashScript [name of file].kt
XDG_SESSION_DESKTOP
echo_normal .MathWorks/ _omb_term_background_magenta QT_ACCESSIBILITY XDG_SESSION_ID
echo_orange .matlab/ _omb_term_background_navy QT_AUTO_SCREEN_SCALE_FACTOR XDG_SESSION_PATH
echo_purple .MATLABConnector/ _omb_term_background_olive QT_WAYLAND_FORCE_DPI XDG_SESSION_TYPE
echo_red MEMORY_PRESSURE_WATCH _omb_term_background_purple QTWEBENGINE_DICTIONARIES_PATH XDG_VTNR
echo_reset_color MEMORY_PRESSURE_WRITE _omb_term_background_red RANDOM XKB_DEFAULT_LAYOUT
echo_underline_black .minecraft/ _omb_term_background_silver RBENV_THEME_PROMPT_PREFIX XKB_DEFAULT_MODEL
echo_underline_blue Minecraft/ _omb_term_background_teal RBENV_THEME_PROMPT_SUFFIX _xspecs
echo_underline_cyan MO_ORIGINAL_COMMAND _omb_term_background_violet RBFU_THEME_PROMPT_PREFIX yellow
echo_underline_green .mozilla/ _omb_term_background_white RBFU_THEME_PROMPT_SUFFIX
echo_underline_orange Music/ _omb_term_background_yellow red
echo_underline_purple .mysql/ _omb_term_black _RED
https://redd.it/1b0k08u
@r_bash
THEME_CLOCK_FORMAT
COLORFGBG GTK_MODULES _omb_prompt_green _omb_util_prompt_command_setup THEME_PROMPT_HOST
COLORTERM GTK_RC_FILES _omb_prompt_lime _omb_util_readlink_visited_init .themes/
COLUMNS HISTCMD _omb_prompt_magenta _omb_util_unload_hook THEME_SHOW_CLOCK
completions HISTCONTROL _omb_prompt_navy OMB_VERSINFO THEME_SHOW_USER_HOST
COMP_WORDBREAKS HISTFILE _omb_prompt_normal _omb_version .thunderbird/
CONDAENV_THEME_PROMPT_PREFIX HISTFILESIZE _omb_prompt_olive OMB_VERSION UID
CONDAENV_THEME_PROMPT_SUFFIX HISTIGNORE _omb_prompt_purple .openjfx/ underline
.config/ HISTSIZE _omb_prompt_red OPTERR underline_black
cyan HISTTIMEFORMAT _omb_prompt_reset_color OPTIND underline_blue
.darling/ HOME OMB_PROMPT_SHOW_PYTHON_VENV orange underline_cyan
.darling.workdir/ HOSTNAME _omb_prompt_silver OSH underline_green
DBUS_SESSION_BUS_ADDRESS HOSTTYPE _omb_prompt_teal OSH_CACHE_DIR underline_orange
Desktop/ .icons/ _omb_prompt_underline_black OSH_CUSTOM underline_purple
DESKTOP_SESSION IFS _omb_prompt_underline_blue OSH_SPECTRUM_TEXT underline_red
DIRSTACK INVOCATION_ID _omb_prompt_underline_brown OSH_THEME underline_white
DISPLAY .java/ _omb_prompt_underline_cyan OSTYPE underline_yellow
Documents/ JOURNAL_STREAM _omb_prompt_underline_gray PAGER USER
.dotnet/ KDE_APPLICATIONS_AS_SCOPE _omb_prompt_underline_green PAM_KWALLET5_LOGIN USER_HOST_THEME_PROMPT_PREFIX
Downloads/ KDE_FULL_SESSION _omb_prompt_underline_lime .password-store/ USER_HOST_THEME_PROMPT_SUFFIX
echo_background_black KDE_SESSION_UID _omb_prompt_underline_magenta PATH .var/
echo_background_blue KDE_SESSION_VERSION
__git_color_moved_ws_opts OMB_DIRECTORIES_CD_USE_PUSHD _omb_term_bold_yellow SCM_GIT_UNSTAGED_CHAR
BASH __git_config_sections _omb_git_post_1_7_2 _omb_term_brown SCM_GIT_UNTRACKED_CHAR
BASH_ALIASES __git_config_vars _omb_module_loaded _omb_term_colors SCM_HG
BASH_ARGC __git_diff_algorithms _omb_prompt_background_black _omb_term_cyan SCM_HG_CHAR
BASH_ARGV __git_diff_common_options _omb_prompt_background_blue _omb_term_gray SCM_NONE
BASH_ARGV0 __git_diff_difftool_options _omb_prompt_background_brown _omb_term_green SCM_NONE_CHAR
BASH_CMDS __git_diff_merges_opts _omb_prompt_background_cyan _omb_term_lime SCM_SVN
BASH_COMMAND __git_diff_submodule_formats _omb_prompt_background_gray _omb_term_magenta SCM_SVN_CHAR
BASH_COMPLETION_VERSINFO __git_fetch_recurse_submodules _omb_prompt_background_green _omb_term_navy SCM_THEME_BRANCH_GONE_PREFIX
BASH_LINENO __git_format_patch_extra_options _omb_prompt_background_lime _omb_term_normal SCM_THEME_BRANCH_PREFIX
BASH_LOADABLES_PATH __git_log_common_options _omb_prompt_background_magenta _omb_term_olive SCM_THEME_BRANCH_TRACK_PREFIX
BASHMARKS_SDIRS __git_log_date_formats _omb_prompt_background_navy _omb_term_purple SCM_THEME_CHAR_PREFIX
BASHOPTS __git_log_gitk_options _omb_prompt_background_olive _omb_term_red SCM_THEME_CHAR_SUFFIX
BASHPID __git_log_pretty_formats _omb_prompt_background_purple _omb_term_reset SCM_THEME_CURRENT_USER_PREFFIX
BASH_REMATCH __git_log_shortlog_options _omb_prompt_background_red _omb_term_reset_color SCM_THEME_CURRENT_USER_SUFFIX
BASH_SOURCE __git_log_show_options _omb_prompt_background_silver _omb_term_silver SCM_THEME_DETACHED_PREFIX
BASH_SUBSHELL __git_merge_strategies _omb_prompt_background_teal _omb_term_teal SCM_THEME_PROMPT_CLEAN
BASH_VERSINFO __git_merge_strategy_options _omb_prompt_background_white _omb_term_underline SCM_THEME_PROMPT_DIRTY
BASH_VERSION __git_mergetools_common _omb_prompt_background_yellow _omb_term_underline_black SCM_THEME_PROMPT_PREFIX
BG __git_patchformat _omb_prompt_black _omb_term_underline_blue SCM_THEME_PROMPT_SUFFIX
black
Decoding hex string
Input consists of 4 hex-encoded ASCII 0..9, a..f:
30 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66
The task is to decode it back to ASCII.
- sample input: 30313233 (echo -n 0124 | xxd -p
)
- sample output: 0123 (echo -n 30313233 | xxd -p -r
)
Current approach:
x=30313233
printf -v u32 '%b' "\\x${x:0:2}\\x${x:2:2}\\x${x:4:2}\\x${x:6:2}"
declare -p u32
Is there a better way in terms of speed? It still must be pure shell.
https://redd.it/1b0fcbj
@r_bash
please someone help me im getting this error for my CIS229 unix class on gitbash, my instructor wants me to just delete the whole software and reinstall and ive done so much i dont wanna start over
Invalid command ':#', perhaps misspe...
\-bash: AH00526:: command not found
\-bash: Invalid: command not found
[root@cis-229-114 \~\]# systemctl restart httpd.service
Job for httpd.service failed because the control process exited with error code.
See "systemctl status httpd.service" and "journalctl -xeu httpd.service" for details.
[root@cis-229-114 \~\]# sudo rm -rf /var/www/html/*
[root@cis-229-114 \~\]# mysql -u your_username -p -e "DROP DATABASE your_database_name;"
Enter password:
ERROR 1698 (28000): Access denied for user 'your_username'@'localhost'
[root@cis-229-114 \~\]# sudo mv wordpress/* .
mv: cannot stat 'wordpress/*': No such file or directory
[root@cis-229-114 \~\]# sudo rm -rf wordpress
[root@cis-229-114 \~\]#
[root@cis-229-114 \~\]# sudo chown -R www-data:www-data /var/www/html/
sudo chmod -R 755 /var/www/html/
chown: invalid user: ‘www-data:www-data’
[root@cis-229-114 \~\]# systemctl restar
Unknown command verb restar.
[root@cis-229-114 \~\]# systemctl restart
Too few arguments.
[root@cis-229-114 \~\]# systemctl restart httpd
Job for httpd.service failed because the control process exited with error code.
See "systemctl status httpd.service" and "journalctl -xeu httpd.service" for details.
​
https://preview.redd.it/yf6nsmvgxtkc1.png?width=1226&format=png&auto=webp&s=18cf1a3d82aaca52e29b0c66a6cb8cc71f377c4d
​
https://redd.it/1b04p9r
@r_bash
Calling all Bashers who work with JSON files...
Hi, I work extensively with JSON files in my automation scripts, so much that I got sick of writing out long lines for JQ.
So I have been building a Bash library with all the JSON functionality I need, as simple to use functions that then do all the underlying work for you.
I need such a library for four other projects I am working on for work, however, we believe in OpenSource and want to give it to you all to use. Before then, I need testers, and I need people to provide recommendations for additional features.
So far we have these functions:
* jsonadd - add a key as an array/value/object to a location
* jsondelete - delete a key from a location
* jsonecho - echo out a location as a string - either to display or into a variable
* jsonedit - edit a key at a location
* jsonembed - strange one, but I have a use case, basically convert JSON where all " is escaped to be \\"
* jsonextract - as above, but the other way round
* jsonlist - list all key names at a location, either to display or into an array
* jsonmerge - merge two json files or datasets into a single file or data sets. Convert matching locations into arrays. Option to merge dups into single entries.
* jsonnew - create a new blank jsonfile or dataset.
* jsonpretty - convert a json file into a pretty format
* jsonsearch - find all locations of a keyname and list them either on screen or into an array
* jsonseek - find all index values in array where key=value - output to screen or an array
* jsonskeleton - writes an array of json keys to a location with each key=null
* jsonsize - if it's a string it returns number of characters, if its a number / boolean / null returns 0, if it's an object returns number of keys, it's an array returns number of indexes.
* jsonsort - writes json file or data into alphabetical order - conserves order of array indexes
* jsonstring - convert a json file into a condensed single line file
* jsontest - tests a key location - returns void if not exist, else returns string, number, null, boolean, object or array
* jsonvalid - validates json file, returns an array of errors or returns nothing if it is valid
* jsonwrite - writes json from a variable to a new file
https://redd.it/1azjs67
@r_bash
Anyone else?
I'm writing a script that does all my install and config from a base xorg install of Arch. My script offers WM choices and choices for a simple or extended install. Nothing hard at all...but sometimes I just stare at it running options through my head looking for ways to make it more functional..etc. I see all these options but just can't move forward because as soon as I do write something I will come up with a better way. I have been staring at the skeleton of my script for hours.
At least I have a good playlist playing.
What do you do to break out of this mode?
https://redd.it/1az8xmn
@r_bash
How to enable 'live' history expansion on the current line?
When I migrated from my old computer to new I lost the ability to perform 'live' history expansion while I type - at least, this is how I recollect it would work - for example, consider these two commands...
ls -l /etc/hosts
cat !$
.. if I recall correctly, as soon as I press SPACE after typing the dollar sign in the second command, the "!$" would be 'live' expanded to "/etc/hosts". It was *very* useful because you can see what the expression would expand to prior to submitting the command.
​
https://redd.it/1ayx5d4
@r_bash
stderr and then returns.
# There are 5 different "levels" of help text that can be displayed.
echo -{,-}usage \
-{,-}{\?,h,help} \
-{,-}help={s,short} \
-{,-}help={f,flags} \
-{,-}help={a,all}
***
Any tips on how to go about implementing this? Can anyone confirm whether or not it is even possible to do this in the way id like for it to work?
Thanks in advance.
https://redd.it/1ayr2up
@r_bash
Tracing where a function was called from
Take for example the following script:
#!/bin/bash
function somefunctionname {
some
code
goes
here
}
function anotherfunctionname {
some
other
code
goes
here
}
main
code
goes
here
What I want to do is have the first function identify if I called the first function from inside the second function or from inside the main part of the code. Is there a way to do this automatically without using global variables or adding data to the end of the function call?
​
Edit: Basically I need to know if it was called from inside another function, and if so, what was that function called. If I don't get a function name I can assume it's the main program.
https://redd.it/1ay443h
@r_bash