• waigl@lemmy.world
    link
    fedilink
    English
    arrow-up
    6
    ·
    edit-2
    10 months ago

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

  • KSP Atlas@sopuli.xyz
    link
    fedilink
    English
    arrow-up
    5
    ·
    10 months ago

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

    • Daedskin@lemm.ee
      link
      fedilink
      English
      arrow-up
      1
      ·
      10 months 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.

  • Elsie@lemmy.mlM
    link
    fedilink
    English
    arrow-up
    4
    ·
    10 months ago

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

  • stembolts@programming.dev
    link
    fedilink
    English
    arrow-up
    3
    ·
    edit-2
    10 months ago

    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.

  • eyeon@lemmy.world
    link
    fedilink
    English
    arrow-up
    2
    ·
    10 months ago

    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.

    • v_krishna@lemmy.ml
      link
      fedilink
      English
      arrow-up
      2
      ·
      10 months ago

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

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

  • aberrate_junior_beatnik@lemmy.world
    link
    fedilink
    English
    arrow-up
    2
    ·
    10 months ago

    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@sh.itjust.worksOP
      link
      fedilink
      English
      arrow-up
      1
      ·
      10 months ago

      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.

    • ziggurat@lemmy.world
      link
      fedilink
      English
      arrow-up
      1
      ·
      10 months 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,

  • Programmer Belch@lemmy.dbzer0.com
    link
    fedilink
    English
    arrow-up
    1
    ·
    edit-2
    10 months 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
    
  • Valso@lemmy.ml
    link
    fedilink
    English
    arrow-up
    1
    ·
    22 days ago

    I’ve disabled bash history. Or rather, I made that file immutable. I did that bc I never needed the file and on top of that something (IDK what) was constantly filling it with repeated commands that I have used until the file becomes a few hundred megabytes. And since I use aliases (currently ~280 aliases with ~200 bash scripts), I don’t need bash history, so I disabled the file. If I need a repeat of a command, I simply repeat the alias.

    The magical braces sounds interesting and I might start using it. Not sure if it will work in a for loop with several commands inside the loop, but it’s worth to try, even if just to see what will happen. :)

    Here’s another trick you obviously don’t know: the for loop is much more readable and understandable (by anyone reading it after you) if you replace the “i” with an actual word, depending on the context, like this:

    for name in *.flac; do newname=$(echo "$name" | rev | cut -f 2- -d '.' | rev) ffmpeg -i "$name" -vn -ar 44100 -ac 2 -ab 1411k -f wav "$newname".wav; done

    This way, any other person who reads your code will be able to better understand the loop, or if they’re like me - will understand in principle what the loop does. Back when I was trying to learn programming, the so called programmers (teachers) were unable to explain where the hell that i comes from and so I was unable to understand how the loop works. I can’t use a function which I don’t understand how it works and/or what it does. It might sound stupid but that’s how my brain works. But once I decided to experiment on my own and instead of “i” I wrote “name” like shown above. And suddenly the for loop became crystal clear about what it does and how it works. An AI helped for the “newname=” contents in the brackets, the rest was me.

    The “touch” file looks more useful for a loop where multiple files with different timestamps must be created. For a single use this is a lot harder to remember than command > /path/to/filename.txt

    Finally, I’d appreciate a shortcut to stop the execution of a command because sometimes Ctrl+C works, but sometimes it doesn’t and instead Ctrl+Z works in its place. If there’s a univeral shortcut to cancel the execution of any command, that would be way more useful, IMO.

    • zarkanian@sh.itjust.worksOP
      link
      fedilink
      English
      arrow-up
      1
      ·
      edit-2
      22 days ago

      If I need a repeat of a command, I simply repeat the alias.

      This only makes sense if you make an alias for every command you ever use…which sounds like a lot of pointless labor. I don’t use bash history anymore, though, because I use fish, and it can autofill your commands without having to do a search through history. Much easier.

      Here’s another trick you obviously don’t know

      You presume too much. I didn’t create this comic. I’ve heard the debate around pros and cons of metasyntactic variables, and I think there are good points on both sides. Typically, when I want to use an example, I try to use a specific case, because it makes it more memorable, but I’ve actually had somebody get more confused by that, so I guess you can’t make everybody happy.

      My question is: Are you confused by algebra? Like, when you see “2 + X = 5”, do you say “I can’t solve this! WTF is X??? What does it mean?”

      The “touch” file looks more useful for a loop where multiple files with different timestamps must be created. For a single use this is a lot harder to remember than command > /path/to/filename.txt

      I’m not sure what you’re saying here. Do you know what touch does? Also, no, it isn’t easier to look up the timestamp and manually type it in, even if it’s just one file. This was really about using $(), not touch, anyway.

      Finally, I’d appreciate a shortcut to stop the execution of a command because sometimes Ctrl+C works, but sometimes it doesn’t and instead Ctrl+Z works in its place. If there’s a univeral shortcut to cancel the execution of any command, that would be way more useful, IMO.

      This is one of the quirks of Unix and Unix-like systems. I was reading something about this recently. I think that it has to do with how programs are written and how they interact with the shell. CTRL-C is used by the shell, but some programs use CTRL-Z instead. So, I think that some programs override the shell or something like that?