this post was submitted on 01 Dec 2024
407 points (99.5% liked)

Bash

763 readers
2 users here now

Talk about the Bash Shell and Bash scripting

founded 4 years ago
MODERATORS
 
top 36 comments
sorted by: hot top controversial new old
[–] [email protected] 38 points 2 days ago (3 children)
[–] [email protected] 13 points 2 days ago

i’m also a fan of

alias please="sudo !!" 
[–] [email protected] 6 points 2 days ago (1 children)
[–] [email protected] 2 points 2 days ago

lol I've had this exact line in my profile for years ❤

[–] [email protected] 24 points 2 days ago (3 children)

cd - goes back to the last directory you have been in

[–] [email protected] 6 points 2 days ago

pushd and popd are also pretty neat in that they allow you to change directories using a stack; particularly useful as part of that is that using pushd without any arguments will pop the directory on top of the stack and move you there, while putting your previous directory on top of the stack. When you're working across directories where you need to move around within each directory, it can be really handy.

[–] [email protected] 1 points 2 days ago

Nice!

Also cd without any parameters takes you to your home directory.

[–] [email protected] 0 points 2 days ago

'cd ..' goes up a level

[–] [email protected] 14 points 2 days ago

Julia Evans’ (@[email protected] on mastodon) website[0] is loaded with similar info-comics and exploration of development and networking tools, among other things.

https://jvns.ca/

[–] [email protected] 16 points 2 days ago* (last edited 2 days ago) (1 children)

Bottom left example will leave you with a lot pictures ending on ".png.jpg".

[–] zarkanian 2 points 2 days ago (1 children)
[–] [email protected] 9 points 2 days ago* (last edited 2 days ago) (1 children)

convert $i ${i%.*}.jpg

NB: I'm no guru - I just googled "remove file extension in bash".

[–] [email protected] 4 points 2 days ago

Should also definitely be quoting both arguments

[–] [email protected] 9 points 2 days ago

lots more emacs shortcuts

You're referring to libreadline, which supports both vi and emacs

https://en.wikipedia.org/wiki/GNU_Readline

Ctrl + _ is a pretty overlooked command

[–] [email protected] 13 points 2 days ago* (last edited 2 days ago) (1 children)

The most useful bash trick for me is to save what I learn in demonstration scripts so I can $cat it later for a syntax reminder.

ex :
file named : ./follow_jellyfin_system_log

contents :
#!/bin/bash
journalclt -fe -u jellyfin

(some time later) .. wtf args do i pass to journalctl again..

$ls ./script_parent_directory

(list of actions written in human language appear as file names)

$cat ./follow_jellyfin_system_log

me : "oh duh!"

rinse and repeat for every command or shortcut you learn, it forces you to convert the command into a short "noun_verb" format which to me is infinitely more understandable.


that's my workflow. then the meta is deciding how to store your scripts so you don't end up with a polluted home dir. godspeed fellow bashers.

[–] [email protected] 5 points 2 days ago (1 children)

For shorter, often used workflows i end up making an alias in bashrc/zshrc.

[–] [email protected] 4 points 2 days ago (1 children)

Tbh, I should consider migrating some of my one-liners to bash aliases. I just like to be cautious to not pollute my shell's auto-complete.

[–] [email protected] 1 points 1 day ago

You can always start them off with an underscore ;)

[–] [email protected] 13 points 2 days ago

Remember for $() to wrap it in quotes to prevent word splitting!!!

[–] [email protected] 6 points 2 days ago

Another cool bash trick: $! gets all the arguments of the previous command, but not the command itself

[–] [email protected] 6 points 2 days ago (1 children)

another useful one is <(cmd here)

It's like $(cmd here) but instead of returning the output of the command as a string passed into the arguments, it makes a new file descriptor for the output of the command and returns the path to it, for use in commands that want a file as an argument.

So for example if you want to use diff to compare your local passwd file to a remote one..

diff -u <(ssh host1 cat /etc/passwd) /etc/passwd

Admittedly I can't think of many things I've used this for outside of diff and alternatives to diff..but I've used it there a lot, like comparing the results of running two slightly different queries.

[–] [email protected] 4 points 2 days ago

I use this one for comm a lot. E.g.,

comm -12 <(sort some_file) <(grep foo some_other_file | sort)

[–] [email protected] 7 points 2 days ago (2 children)

The most useful bash command of all: sudo apt-get -y install zsh; chsh -s zsh; exec zsh ;)

I kid, I kid! I actually like bash a lot. I really prefer it for scripting. Arrays are extremely useful but not specified in posix. Bash is pretty ubiquitous though.

I'm also curious if there are any bash partisans who prefer it over zsh and for what reasons.

[–] zarkanian 7 points 2 days ago (2 children)

I actually prefer fish, but I want to learn more bash because is is ubiquitous and a lot of bash stuff also works in fish.

[–] [email protected] 3 points 2 days ago (2 children)

You may also like NuShell. It's been designed from the ground up to be an intuitive and convenient shell language.

[–] [email protected] 6 points 2 days ago (1 children)

Wait, the other shells were designed to be obtuse and inconvenient? /s

[–] [email protected] 2 points 2 days ago* (last edited 2 days ago)

Haha whoops, didn't want to imply that. I meant to say that it's intuitive for me, who finds bash syntax cryptic.

[–] [email protected] 1 points 2 days ago (1 children)

Can you tell me how to run a command and ignore an alias in NuShell? I don't really use nu but when i tried to write something in it, this was something that eluded me

[–] [email protected] 4 points 2 days ago (1 children)

Oh, if you want to avoid running a built in command like ls or cp and want to run the actual thing in /usr/bin, you prefix it with a ^, so eg ^cp -p.

[–] [email protected] 1 points 2 days ago* (last edited 2 days ago) (1 children)

Interesting. What does the ^ do in this situation?

And I just want to not respect an alias, so falls back to either builtin or path.

In zsh or bash I can prefix the command with the word command, or a backslash (directly before the command)

[–] [email protected] 2 points 2 days ago

Fish is great! I used it for a while a long time ago but I ended up stopping because a few tools expected your shell to be set to something posix compatible. I wonder if the support is better now, I should give it a shot

[–] [email protected] 3 points 2 days ago

I'm a serious bash scripter, I mean I do it both at work and as a hobby. And zsh arrays are better. Like you can use negative indecees and stuff. I have only written shell functions in zsh (my primary shell), and not thousands of lines of scripts like I have for bash. But if zsh had as good documentation and language servers I'd probably do many scripts in zsh instead. But I can't say for certain, as I am not as sure about performance in some situations and stuff.

Why don't I use posix shell if I care about performance? Because they are only faster in very simple scripts,

[–] [email protected] 3 points 2 days ago* (last edited 2 days ago)

I am not sure what the default keybinding is for this but I always create a .inputrc file for searching forward and backward in the history without opening the C-r menu:

"C-p": history-search-backward
"C-n": history-search-forward
[–] Classy 1 points 2 days ago

Oh my god, I didn't realize this was an NSFW community. This graphic changed my life