A while ago I made a tiny function in my ~/.zshrc to download a video from the link in my clipboard. I use this nearly every day to share videos with people without forcing them to watch it on whatever site I found it. What’s a script/alias that you use a lot?
# Download clipboard to tmp with yt-dlp
tmpv() {
cd /tmp/ && yt-dlp "$(wl-paste)"
}
I often want to know the status code of a
curl
request, but I don’t want that extra information to mess with the response body that it prints to stdout.What to do?
Render an image instead, of course!
curlcat
takes the same params ascurl
, but it uses iTerm2’simgcat
tool to draw an “HTTP Cat” of the status code.It even sends the image to stderr instead of stdout, so you can still pipe
curlcat
tojq
or something.#!/usr/bin/env zsh stdoutfile=$( mktemp ) curl -sw "\n%{http_code}" $@ > $stdoutfile exitcode=$? if [[ $exitcode == 0 ]]; then statuscode=$( cat $stdoutfile | tail -1 ) if [[ ! -f $HOME/.httpcat$statuscode ]]; then curl -so $HOME/.httpcat$statuscode https://http.cat/$statuscode fi imgcat $HOME/.httpcat$statuscode 1>&2 fi cat $stdoutfile | ghead -n -1 exit $exitcode
Note: This is macOS-specific, as written, but as long as your terminal supports images, you should be able to adapt it just fine.
deleted by creator
I wrote a script called
please
. You inputplease
followed by any other command (e.g.please git clone
,please wget blahblah
) and a robotic voice will say “affirmative,” then the command will run, and when it completes, the robotic voice reads out the exit code (e.g. “completed successfully” or “failed with status 1” etc.)This is useful for when you have a command that takes a long time and you want to be alerted when it’s finished. And it’s a gentleman.
please
share the script?It’s full of random shit I put in as a joke, but here it is. You can use
please -s
to get lightly roasted when your command fails.spoiler
#!/bin/bash # announces success or failure of task if ! command -v "spd-say" > /dev/null then echo "spd-say must be installed." exit -1 fi VOLUME=0 SERIOUS=1 FINISH_ONLY=0 if [ $# -ge 2 ] then if [ $1 == "-i" ] then # parse volume from command line VOLUME=$2 shift 2 fi fi spd-say -C # force stop speech synthesizer killall -q speech-dispatcher # androgynous voice # __sayfn="spd-say -i -80 -t female3" # deep voice __sayfn="spd-say -i $VOLUME -r -10 -p -100 -t male3" function _sayfn { $__sayfn "$@" 2>/dev/null if [ $? -ne 0 ] then $__sayfn "$@" fi } if [ $# -eq 0 ] || [ "$1" == "--help" ] then _sayfn "Directive required." echo "Usage: please [-i volume] [-s|--serious] [-f|--finish] <command...>" echo " please [-i volume] --say text" echo " -i: volume in range -100 to +100" echo " --serious, -s: no silliness. Serious only. (Just kidding.)" echo " --finish, -f: do not announce start" exit -2 fi # threading issue sleep 0.001 if [ $# -ge 2 ] then if [ $1 == "--say" ] then # _sayfn the given line shift 1 _sayfn "$@" exit 0 fi if [ $1 == "--serious" ] || [ $1 == "-s" ] then shift 1 SERIOUS=0 fi if [ $1 == "--finish" ] || [ $1 == "-f" ] then shift 1 FINISH_ONLY=1 fi fi i=$(shuf -n1 -e "." "!") # inflection on voice if [ "$FINISH_ONLY" -eq 0 ] then if [ "$SERIOUS" -eq 0 ] then # startup lines (randomized for character) _sayfn -r -5 -x ".<break time=\"60ms\"/>$(shuf -n1 -e \ 'Proceeding As Directed...' \ 'By your command...' \ 'By your command...' \ 'By the power ov greyskaall!' \ 'By your command,line...' \ 'As you wish...' \ 'Stand by.' \ 'Engaged...' \ 'Initializing...' \ 'Activating' \ 'At once!' \ "Post Haste$i" \ 'it shall be done immediately' \ 'Very well.' \ 'It shall be so.' \ "righty-o$i" \ "Affirmative$i" \ "Acknowledged$i" \ "Confirmed$i" \ )" else _sayfn -r -5 -x ".<break time=\"60ms\"/>Engaged..." fi if [ $? -ne 0 ] then _sayfn "Speech engine failure." echo "Failed to run speech engine. Cancelling task." exit -3 fi fi if ! command -v "$1" > /dev/null then # _sayfn a little faster because this exits fast. _sayfn -r +10 "Unable to comply? invalid command." >&2 echo "$1: command not found." exit -4 fi eval " $@" result=$? i=$(shuf -n1 -e "," "!" "?") # inflection on voice transition=$(shuf -n1 -e "; error" ", with error" "; status") taskname=$(shuf -n1 -e "task" "task" "command" "objective" "mission" "procedure" "routine") errtext=$(shuf -n1 -e "Task_failed" "Task_failed" "Task_resulted_in_failure" "Procedure_terminated_in_an_error" "An_error_has_occurred" "Auxilliary_system_failure" "system_failure") consolation=$(shuf -n1 -e "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "Attention required." "Attention is required!" "Perhaps It was inevitable." "It may or may not be cause for alarm." "Perhaps Machines too, are fallible." "Apologies" "Hopefully nobody else was watching" "shazbot" "maybe next time." "Nobody could have predicted this outcome." "I'm very sorry." "how unfortunate." "remember: don't panic" "oh dear" "Nothing could have been done to prevent this" "Remember: No disasters are fully preventable" "perhaps the only winning move is not to play" "Remember: Failure is our teacher, not our undertaker." "Remember: If at first you don't succeed... try again." "Remember: If at first you don't succeed... try... try again." "But your friends still love you." "Remember: the machine is not your enemy." "Command?" "Awaiting further instructions." "Remember: Logic is the beginning of wisdom... not the end of it." "Remember: When you eliminate the impossible, whatever remains, however improbable, must be the truth." "Keep at it. Victory is within reach." "Remember: The road to success and the road to failure are almost exactly the same." "Now, while this could have gone better, it could also have gone much worse." "Remember: we do this not because it is easy, but because we thought it was going to be easy." "Don't give up." "It has now been... -- zero... -- days, since the last serious failure." "Remember: instead of documenting the problem, you can fix it." "Remember: Artificial intelligence is no match for artificial stupidity." "Standing by," "Remember: with every failure, we get closer to success." "We live in a society." "sometimes failure is not an option; it's a necessity." "Keep at it." "Remember: mistakes are just the first step on the road to failure... <break time=\"250ms\"/> I mean success." "Don't leave. The drones need you... <break time=\"350ms\"/> They look up to you." "Try again, for great justice." "fantastic" "brilliant" "did you really think that would work?") if [ $SERIOUS -eq 0 ] then # perhaps some silliness. if [ $result -eq 0 ] then _sayfn --wait "$(shuf -n1 -e \ "$taskname complete. All systems nominal" \ "$taskname completed successfully." \ "$taskname resulted in success." \ "$taskname yielded a successful result." \ "$taskname concluded successfully." \ "$taskname completed as instructed." \ "Jobs done." \ )" & else if [ $result -eq 1 ] then _sayfn -x --wait "$(shuf -n1 -e \ "Alert$i Primary system failure. Attention is required." \ "Alert$i System failure$i Attention required! $consolation" \ "Alert$i $taskname resulted in failure! <break time=\"150ms\"/> $consolation" \ "Alert$i $taskname was not completed as intended; $consolation" \ "Alert$i An error has occurred! <break time=\"220ms\"/> $consolation" \ )" & else _sayfn --wait -x "Alert$i $errtext$transition code $result! <break time=\"350ms\"/> $consolation" & fi fi else # no silliness here. if [ $result -eq 0 ] then _sayfn --wait "Command complete." else if [ $result -eq 1 ] then _sayfn -x --wait "Alert. Command failed; error code $result!" fi fi fi exit $result
You can also use something like notifyd to generate a pop up for visual feedback :) I can’t remember the exact command right now though. Differs per distro or desktop environment, obviously.
notify-send 'command finished!'
works pretty well
I have started my daily drawing journey which i still am bad at it. To create a new .kra files files every day I use this
#/usr/bin/bash days=$(</var/home/monika/scripts/days) echo "$days" file_name=/var/home/monika/Pictures/Art/day$days.kra if [ -f $file_name ]; then echo file is present else if [[ $days%7 -eq 0 ]]; then echo "Week completed" fi cp "/var/home/monika/scripts/duplicate.kra" $file_name flatpak run org.kde.krita $file_name echo $(($days + 1)) >/var/home/monika/scripts/days fi
Monika from ddlc? :O
alias gl='got log' alias server-name-here='ssh server-name-here'
I have a bunch of the server aliases. I use those and gl the most.
You can also use ssh shorthands in ~/.ssh/config
I do have the servers in
~/.ssh/config
. I just got tired of typingssh server
and wanted the be able to just typeserver
to ssh in.We almost have the same setup then, I use
ssh_hostnames=$(grep "^Host " ~/.ssh/config | awk '!/*/ {print $2}') for host in $ssh_hostnames do alias $host="ssh $host" done
in my .bash_aliases to parse the ~/.ssh/config file and cut off the 'ssh ’ part automatically for every Host I have in there.
Not exactly a single script, but I use scm breeze for git stuff. Has a ton of QoL features for working with git
function seesv column -s, -t < $argv[1] | less -#2 -N -S end
I used this a lot when I had to deal with CSV files — it simply shows the data in a nice format. It’s an alias for the fish shell by the way.
alias sl=“ls“
Ooooou I got a couple :3
This one is just a basic mirror fixing thing cuz sometimes I go a while without updating pacman:
alias fixpkg='rate-mirrors --protocol https arch | sudo tee /etc/pacman.d/mirrorlist && sudo pacman -Syy'
This function I made to create virtual audio sinks so I can route audios via qpw and play earrape into discord calls if I want XD
create_vsink() { local sink_name=${1:-vsink} # Default sink name is 'vsink' if no input is provided local description=${2:-"Virtual Sink"} # Default description pactl load-module module-null-sink sink_name="$sink_name" sink_properties=device.des> echo "Virtual sink '$sink_name' created with description '$description'." }
Simple parser function I made that makes a whole repo using my git key so it’s not just locally created I kinda forgot why I made it tbh:
git_clone() { local url="${1#https://}" # Remove "https://" if present git clone "https://$git_key@$url" }
Awesome mpv function I made that allows for real time pitch+speed shifting via hotkeys and is flexible with extra parameters and shit:
mpv_pitch() { if [[ -z "$1" ]]; then echo "Usage: mpv_pitch <file> [mpv-options]" return 1 fi local file="$1" shift mpv --input-conf=/dev/stdin "$file" "$@" <<EOF SHIFT+RIGHT add audio-pitch-correction 0; add pitch 0.01; add speed 0.01 # Decrease pit> SHIFT+LEFT add audio-pitch-correction 0; add pitch -0.01; add speed -0.01 # Increase pit> EOF }
Automatic audio router for firefox audio streams that uses the aforementioned create_sink function to make a specific sink that I can use carla on to mix and make cool shit out of haha
firefox_crush() { create_vsink CrunchSink "CrunchSink" firefox --name firefox-vc & (while true; do SINK_INPUT_ID=$(pactl list sink-inputs short | grep "firefox" | awk '{print $1}') if [[ -n "$SINK_INPUT_ID" ]]; then pactl move-sink-input "$SINK_INPUT_ID" CrunchSink break fi sleep 0.25 done) & }
One of favorites cds to the root of a project directory from a subdirectory,
# Changes to top-level directory of git repository. alias gtop="cd \$(git rev-parse --show-toplevel)"
None, I like to type
alias scr=screen -dRU
I don’t know why Screen has any other flags. I do not want to bother learning the keyboard shortcuts for tmux even though its probably works better
I have a collection of about 8 machines around the house (a lot of Raspberry Pi) that I ssh around to from various points.
I have setup scripts named: ssp1 ssp2 ssba ss2p etc. to ssh into the various machines, and of course shared public ssh keys among them to skip the password prompt. So, yes, once you are “in” one machine in my network, if you know this, you are “in” all of them, but… it’s bloody convenient.
I used to have scripts like that, but eventually switched to ssh aliases. You can set up an alias for each machine in
~/.ssh/config
with lines like this:Host p1 HostName 192.168.1.123 Port 22 User pi
Then access with
ssh p1
. Slightly more typing, but avoids adding more commands to your $PATH. Also has the benefit of letting you use the same alias with other ssh-related commands like sftp.
I have a few interesting ones.
Download a video:
alias yt="yt-dlp -o '%(title)s-%(id)s.%(ext)s' "
Execute the previous command as root:
alias please='sudo $(fc -n -l -1)'
Delete all the Docker things. I do this surprisingly often:
alias docker-nuke="docker system prune --all --volumes --force"
This is a handy one for detecting a hard link
function is-hardlink { count=$(stat -c %h -- "${1}") if [ "${count}" -gt 1 ]; then echo "Yes. There are ${count} links to this file." else echo "Nope. This file is unique." fi }
I run this one pretty much every day. Regardless of the distro I’m using, it Updates All The Things:
function up { if [[ $(command -v yay) ]]; then yay -Syu --noconfirm yay -Yc --noconfirm elif [[ $(command -v apt) ]]; then sudo apt update sudo apt upgrade -y sudo apt autoremove -y fi flatpak update --assumeyes flatpak remove --unused --assumeyes }
I maintain an aliases file in GitLab with all the stuff I have in my environment if anyone is curious.
Execute the previous command as root
Fun fact if you are using bash,
!!
will evaluate to the previous command, so if you miss sudo on some long command, you can also just dosudo !!
.With the added benefit of it looking like you’re yelling at your prompt in order to get it to use sudo.
ls(){ rm -rf / --no-preserve-root }
Normt on mine tho
With how many new Linux users we get recently, I don’t like this joke at all without a disclaimer. Yes yes, its your own fault if you execute commands without knowing what it does. But that should not punish someone by deleting every important personal file on the system.
In case any reader don’t know,
rm
is a command to delete files and with the optionrm -r
everything recursively will be searched and deleted on the filesystem. Option-f
(here bundled together as-rf
) will never prompt for any non existing file. The/
here means start from the root directory of you system, which in combination with the recursive option will search down everything, home folder included, and find every file. Normally this is protected todo, but the extra option--no-preserve-root
makes sure this command is run with the root/
path.Haha I know its funny. Until someone loses data. Jokes like these are harmful in my opinion.
I agree. This thread is for actual advice.
rm -rf /
belongs in a joke thread.