Live data from Hacker News

Scripts I wrote that I use all the time

evanhahn.com

381–390 of 408 posts

Re: Scripts I wrote that I use all the time

#381

My fav script to unpack anything, found a few years ago somewhere # ex - archive extractor # usage: ex function ex() { if [ -f $1 ] ; then case $1 in *.tar.bz2) tar xjf $1 ;; *.tar.gz) tar xzf $1 ;; *.tar.xz) tar xf $1 ;; *.bz2) bunzip2 $1 ;; *.rar) unrar x $1 ;; *.gz) gunzip $1 ;; *.tar) tar xf $1 ;; *.tbz2) tar xjf $1 ;; *.tgz) tar xzf $1 ;; *.zip) unzip $1 ;; *.Z) uncompress $1;; *.7z) 7z x $1 ;; *) echo "'$1' can…

I had found a zsh version somewhere which I've updated a few times over the years though I don't get a chance to use it much. :'D

    un () {
 unsetopt extendedglob
 local old_dirs current_dirs lower do_cd
 if [ -z "$1" ]
 then
  print "Must supply an archive argument."
  return 1
 fi
 if [ -d "$1" ]
 then
  print "Can't do much with directory arguments."
  return 1
 fi
 if [ ! -e "$1" -a ! -h "$1" ]
 then
  print "$1 does not exist."
  return 1
 fi
 if [ ! -r "$1" ]
 then
  print "$1 is not readable."
  return 1
 fi
 do_cd=1 
 lower="${(L)1}" 
 old_dirs=(*(N/)) 
 undone=false 
 if which unar > /dev/null 2>&1 && unar "$1"
 then
  undone=true 
 fi
 if ! $undone
 then
  INFO="$(file "$1")" 
  INFO="${INFO##*: }" 
  if command grep -a --line-buffered --color=auto -E "Zstandard compressed data" > /dev/null  /dev/null  /dev/null  /dev/null
  then
   unrar e "$1"
  elif echo "$INFO" | command grep -a --line-buffered --color=auto -E 'xar archive' > /dev/null
  then
   xar -xvf "$1"
  elif echo "$INFO" | command grep -a --line-buffered --color=auto -E -i "tar archive" > /dev/null
  then
   if which gtar > /dev/null 2>&1
   then
    gtar xvf "$1"
   else
    tar xvf "$1"
   fi
  elif echo "$INFO" | command grep -a --line-buffered --color=auto -E -i "LHa" > /dev/null
  then
   lha e "$1"
  elif echo "$INFO" | command grep -a --line-buffered --color=auto -E -i "LHa" > /dev/null
  then
   lha e "$1"
  elif echo "$INFO" | command grep -a --line-buffered --color=auto -E "compress'd" > /dev/null
  then
   uncompress -c "$1"
  elif echo "$INFO" | command grep -a --line-buffered --color=auto -E "xz compressed" > /dev/null
  then
   unxz -k "$1"
   do_cd=0 
  elif echo "$INFO" | command grep -a --line-buffered --color=auto -E "7-zip" > /dev/null
  then
   7z x "$1"
  elif echo "$INFO" | command grep -a --line-buffered --color=auto -E "RPM " > /dev/null
  then
   if [ "$osname" = "Darwin" ]
   then
    rpm2cpio "$1" | cpio -i -d --quiet
   else
    rpm2cpio "$1" | cpio -i --no-absolute-filenames -d --quiet
   fi
  elif echo "$INFO" | command grep -a --line-buffered --color=auto -E "cpio archive" > /dev/null
  then
   cpio -i --no-absolute-filenames -d --quiet  /dev/null
  then
   dpkg-deb -x "$1" .
  elif echo "$INFO" | command grep -a --line-buffered --color=auto -E -i " ar archive" > /dev/null
  then
   ar x "$1"
  elif echo "$INFO" | command grep -a --line-buffered --color=auto -E -i "ACE archive" > /dev/null
  then
   unace e "$1"
  elif echo "$INFO" | command grep -a --line-buffered --color=auto -E -i "ARJ archive" > /dev/null
  then
   arj e "$1"
  elif echo "$INFO" | command grep -a --line-buffered --color=auto -E -i "xar archive" > /dev/null
  then
   xar -xvf "$1"
  elif echo "$INFO" | command grep -a --line-buffered --color=auto -E -i "ZOO archive" > /dev/null
  then
   zoo x "$1"
  elif echo "$INFO" | command grep -a --line-buffered --color=auto -E -Ei "(tnef|Transport Neutral Encapsulation Format)" > /dev/null
  then
   tnef "$1"
  elif echo "$INFO" | command grep -a --line-buffered --color=auto -E -i "InstallShield CAB" > /dev/null
  then
   unshield x "$1"
  elif echo "$INFO" | command grep -a --line-buffered --color=auto -E -Ei "(mail|news)" > /dev/null
  then
   formail -s munpack  /dev/null
  then
   uudecode "$1"
  elif echo "$INFO" | command grep -a --line-buffered --color=auto -E -i "cab" > /dev/null
  then
   cabextract "$1"
  elif echo "$INFO" | command grep -a --line-buffered --color=auto -E -i "PPMD archive" > /dev/null
  then
   ln -s "$1" . && ppmd d "$1" && rm `basename "$1"`
  elif [[ $lower == *.zst ]]
  then
   zstd -T0 -d "$1"
  elif [[ $lower == *.bz2 ]]
  then
   bunzip2 -kv "$1"
  elif [[ $lower == *.zip ]]
  then
   unzip "$1"
  elif [[ $lower == *.jar ]]
  then
   unzip "$1"
  elif [[ $lower == *.xpi ]]
  then
   unzip "$1"
  elif [[ $lower == *.rar ]]
  then
   unrar e "$1"
  elif [[ $lower == *.xar ]]
  then
   xar -xvf "$1"
  elif [[ $lower == *.pkg ]]
  then
   xar -xvf "$1"
  elif [[ $lower == *.tar ]]
  then
   if which gtar > /dev/null 2>&1
   then
    gtar xvf "$1"
   else
    tar xvf "$1"
   fi
  elif [[ $lower == *.tar.zst || $lower == *.tzst ]]
  then
   which gtar > /dev/null 2>&1
   if [[ $? == 0 ]]
   then
    gtar -xv -I 'zstd -T0 -v' -f "$1"
   elif [[ ${OSTYPE:l} == linux* ]]
   then
    tar -xv -I 'zstd -T0 -v' -f "$1"
   else
    zstd -d -v -T0 -c "$1" | tar xvf -
   fi
  elif [[ $lower == *.tar.gz || $lower == *.tgz ]]
  then
   which gtar > /dev/null 2>&1
   if [[ $? == 0 ]]
   then
    gtar zxfv "$1"
   elif [[ ${OSTYPE:l} == linux* ]]
   then
    tar zxfv "$1"
   else
    gunzip -c "$1" | tar xvf -
   fi
  elif [[ $lower == *.tar.z ]]
  then
   uncompress -c "$1" | tar xvf -
  elif [[ $lower == *.tar.xz || $lower == *.txz ]]
  then
   which gtar > /dev/null 2>&1
   if [[ $? == 0 ]]
   then
    xzcat "$1" | gtar xvf -
   else
    xzcat "$1" | tar xvf -
   fi
  elif echo "$INFO" | command grep -a --line-buffered --color=auto -E 'gzip compressed' > /dev/null || [[ $lower == *.gz ]]
  then
   if [[ $lower == *.gz ]]
   then
    gzcat -d "$1" > "${1%.gz}"
   else
    cat "$1" | gunzip -
   fi
   do_cd=0 
  elif [[ $lower == *.tar.bz2 || $lower == *.tbz ]]
  then
   bunzip2 -kc "$1" | tar xfv -
  elif [[ $lower == *.tar.lz4 ]]
  then
   local mytar
   if [[ -n "$(command -v gtar)" ]]
   then
    mytar=gtar 
   else
    mytar=tar 
   fi
   if [[ -n "$(command -v lz4)" ]]
   then
    $mytar -xv -I lz4 -f "$1"
   elif [[ -n "$(command -v lz4cat)" ]]
   then
    lz4cat -kd "$1" | $mytar xfv -
   else
    print "Unknown archive type: $1"
    return 1
   fi
  elif [[ $lower == *.lz4 ]]
  then
   lz4 -d "$1"
  elif [[ $lower == *.epub ]]
  then
   unzip "$1"
  elif [[ $lower == *.lha ]]
  then
   lha e "$1"
  elif which aunpack > /dev/null 2>&1
  then
   aunpack "$@"
   return $?
  else
   print "Unknown archive type: $1"
   return 1
  fi
 fi
 if [[ $do_cd == 1 ]]
 then
  current_dirs=(*(N/)) 
  for i in {1..${#current_dirs}}
  do
   if [[ $current_dirs[$i] != "$old_dirs[$i]" ]]
   then
    cd "$current_dirs[$i]"
    ls
    break
   fi
  done
 fi
    }

Re: Scripts I wrote that I use all the time

#382
post #250

I have a bunch, but one that I rarely see mentioned but use all the time is memo(1) ( https://github.com/aktau/dotfiles/blob/master/bin/memo ). It memoizes the command passed to it. $ memo curl https://some-expensive.com/api/call | jq . | awk '...' Manually clearing it (for example if I know the underlying data has changed: $ memo -c curl https://some-expensive.com/api/call In-pipeline memoization (includes the input…

I've been using bkt (https://github.com/dimo414/bkt) for subprocess caching. It has some nice features, like providing a ttl for cache expiration. In-pipeline memoization looks nice, I'm not sure it supports that

Re: Scripts I wrote that I use all the time

#383

These are great, and I have a few matching myself. Here are some super simple ones I didn't see that I use almost every day: cl="clear" g="git" h="history" ll="ls -al" path='echo -e ${PATH//:/\\n}' lv="live-server" And for common navigation: dl="cd ~/Downloads" dt="cd ~/Desktop"

[deleted]

Re: Scripts I wrote that I use all the time

#384

Earlier quoted context omitted.

Yes, flagging mechanism on HN is evil.

It’s a blunt tool, but quite useful for posts. I read most dead posts I come across and I don’t think I ever saw one that was not obviously in violation of several guidelines. OTOH I don’t like flagging stories because good ones get buried regularly. But then HN is not a great place for peaceful, nuanced discussion and these threads often descend into mindless flame wars, which would bury the stories even without fla…

Just imagine this comment of yours would get flagged. Was it something very valuable and now the discussion is lacking something important? Surely not, but how would you feel? So what that you have some not so mild and not so "pleasant" opinion on something - why flag the comment? Just let people downvote it!

Re: Scripts I wrote that I use all the time

#385
post #376

Earlier quoted context omitted.

That's still not professional, but then again 99.9% of companies aren't.

Could you help me understand what assumptions about the access method you have in place that make this seem unprofessional? Let's assume they need access to the full service account environment for the work, which means they need to login or run commands as the service account. This is a bit outside my domain, so this is a genuine question. I've worked on single user and embedded systems where this isn't possible , s…

[dead]

Re: Scripts I wrote that I use all the time

#387

Earlier quoted context omitted.

If, in the year 2025, you are still using a shared account called "root" (password: "password"), and it's not a hardware switch or something (and even they support user accounts these days), I'm sorry, but you need to do better. If you're the vendor, you need to do better, if you're the client, you need to make it an issue with the vendor and tell them they need to do better. I know, it's easy for me to say from the…

It’s 2025. I don’t even have the login password to any server, they’re not unicorns, they’re cattle. If something is wrong with a server, we terminate it and spin up a new one. No need for anyone to log in. In very rare cases it might be relevant to log in to a running server, but I haven’t done that in years.

[dead]

Re: Scripts I wrote that I use all the time

#388
post #55

I have a bunch of little scripts and aliases I've written over the years, but none are used more than these... alias ..='cd ..' alias ...='cd ../..' alias ....='cd ../../..' alias .....='cd ../../../..' alias ......='cd ../../../../..' alias .......='cd ../../../../../..'

I used to do this, but unary kind of sucks after 3; So maybe others might like this better before their fingers get trained:

    ..() { # Usage: .. [N=1] -> cd up N levels
      local d="" i
      for ((i = 0; i 
Of course, what I actually have been doing since the early 90s is realize that a single "." with no-args is normally illegal and people "cd" soooo much more often than sourcing script definitions. So, I hijack that to save one "." in the first 3 cases and then take a number for the general case.

    # dash allows non-AlphaNumeric alias but not function names; POSIX is silent.
    cd1 () { if [ $# -eq 0 ]; then cd ..; else command . "$@"; fi; } # nice "cd .."
    alias .=cd1
    cdu() {           # Usage: cdu [N=2] -> cd up N levels
      local i=0 d=""  # "." already does 1 level
      while [ $i -lt ${1:-"2"} ]; do d=$d/..; i=$((i+1)); done
      [ -z "$d" ] || cd ./$d; }
    alias ..=cdu
    alias ...='cd ../../..' # so, "."=1up, ".."=2up, "..."=3up, ".. N"=Nup
and as per the comment this even works in lowly dash, but needs a slight workaround. bash can just do a .() and ..() shell function as with the zsh.

Re: Scripts I wrote that I use all the time

#389

Earlier quoted context omitted.

When I had one nix computer, I wanted to customize it heavily. Now I have many nix computers and I want them consistent and with only the most necessary packages installed.

I don't get why this is a problem. Just stick all your configs in a git repo and clone it wherever you need it.

I run two OSes. So two variants.

Some are desktops, some laptops, some servers. Different packages installed, different hardware. Three more variants.

Yes, I do have a script to set up my environment, but it already has a lot of conditional behavior to handle these five total variants. And I don't want to have to re-test the scripts and re-sync often.

Re: Scripts I wrote that I use all the time

#390
post #250

I have a bunch, but one that I rarely see mentioned but use all the time is memo(1) ( https://github.com/aktau/dotfiles/blob/master/bin/memo ). It memoizes the command passed to it. $ memo curl https://some-expensive.com/api/call | jq . | awk '...' Manually clearing it (for example if I know the underlying data has changed: $ memo -c curl https://some-expensive.com/api/call In-pipeline memoization (includes the input…

This is terrific! I curl to files and then pipe them, all the time. This will be a great help. I wonder if we have gotten to the point where we can feed an LLM our bash history and it could suggest improvements to our workflow.

Interesting idea. And pretty easy to try.

If you do it, I'd love to hear your results.

In general, I wonder if we're at the point where an LLM watching you interact with your computer for twenty minutes can improve your workflow, suggest tools, etc. I imagine so, because when I think to ask how to do something, I often get an answer that is very useful, so I've automated/fixed far more things than in the past.

Post reply on HN