initial commit; repository moved
This commit is contained in:
commit
2e84e05fe5
16 changed files with 309 additions and 0 deletions
37
README.md
Normal file
37
README.md
Normal file
|
@ -0,0 +1,37 @@
|
|||
|
||||
# Shell Scripts
|
||||
|
||||
A handful of scripts I've written to make my life easier on Linux.
|
||||
|
||||
## banana-runner
|
||||
|
||||
A Python script that runs command shortcuts from an ini file. Quick and easy to set
|
||||
up.
|
||||
|
||||
## codecat
|
||||
|
||||
A bash functino that wraps GNU `source-highlight` in a way that isn't a complete
|
||||
nightmare to use. Automatically sets the `-f`, `-i`, and `--src-lang` flags where
|
||||
appropriate.
|
||||
|
||||
## goto
|
||||
|
||||
A local jump bash function. Propagates backwards through the working path to find a
|
||||
`.goto` ini file, and supports chaining jumps if you need that kind of thing.
|
||||
|
||||
## inet
|
||||
|
||||
A collection of network related scripts:
|
||||
|
||||
- `is-back`: send a notification once the internet connection is online
|
||||
- `myip`: gets the machine's local IP address
|
||||
- `weather`: wraps [wttr.in](https://wttr.in) with location
|
||||
|
||||
## mountain
|
||||
|
||||
Friendly and consistent device mounting/unmounting.
|
||||
|
||||
## run
|
||||
|
||||
Just runs `.run` in a directory.
|
||||
|
7
banana-runner/.banana
Normal file
7
banana-runner/.banana
Normal file
|
@ -0,0 +1,7 @@
|
|||
[$]
|
||||
TEST = foo bar
|
||||
|
||||
[test]
|
||||
command = echo '${TEST}'
|
||||
shell = true
|
||||
|
69
banana-runner/banana-runner.py
Executable file
69
banana-runner/banana-runner.py
Executable file
|
@ -0,0 +1,69 @@
|
|||
#!/usr/bin/python
|
||||
from configparser import ConfigParser
|
||||
from os import chdir, getcwd
|
||||
from os.path import devnull, expanduser, isdir, isfile
|
||||
from re import search
|
||||
from shlex import split
|
||||
from subprocess import Popen, run
|
||||
from sys import argv, stdin, stdout, stderr
|
||||
|
||||
config = ConfigParser()
|
||||
CONFIG_PATH = f'{getcwd()}/.banana'
|
||||
if not isfile(CONFIG_PATH):
|
||||
print("banana-runner: no config found!")
|
||||
exit(1)
|
||||
config.read(CONFIG_PATH)
|
||||
sections = config.sections()
|
||||
|
||||
sections.remove("$")
|
||||
|
||||
if len(argv) == 1 or argv[0] == "$":
|
||||
print("banana-runner: no arguments given")
|
||||
exit(1)
|
||||
|
||||
if argv[1] == '-l' or argv[1] == '--list':
|
||||
# do thing
|
||||
for section in sections:
|
||||
if section == '$':
|
||||
continue
|
||||
print(f'{section}')
|
||||
exit()
|
||||
|
||||
name = argv[1]
|
||||
if name not in sections:
|
||||
print(f'banana-runner: no section {name} found')
|
||||
exit(1)
|
||||
section = config[name]
|
||||
|
||||
cmd = section['command']
|
||||
alias_list = config['$']
|
||||
|
||||
def sub_aliases(string):
|
||||
output = string
|
||||
for alias in alias_list:
|
||||
substring = '${' + alias.upper() + "}"
|
||||
if substring in output:
|
||||
output = output.replace(substring, alias_list[alias])
|
||||
return output
|
||||
|
||||
cmd = sub_aliases(cmd)
|
||||
|
||||
if 'target' in section:
|
||||
tdir = sub_aliases(section['target'])
|
||||
tdir = expanduser(tdir)
|
||||
if isdir(tdir):
|
||||
chdir(tdir)
|
||||
else:
|
||||
if isfile(tdir):
|
||||
print(f'banana-runner: "{tdir}" is not a directory!')
|
||||
else:
|
||||
print(f'banana-runner: "{tdir}" does not exist!')
|
||||
exit(1)
|
||||
|
||||
print(f" {cmd}")
|
||||
|
||||
if 'shell' in section and section['shell']:
|
||||
run(split(cmd))
|
||||
else:
|
||||
with open(devnull, 'w') as _:
|
||||
Popen(cmd, shell = True, stdout = _, stderr = _)
|
17
banana-runner/banana-runner.sh
Normal file
17
banana-runner/banana-runner.sh
Normal file
|
@ -0,0 +1,17 @@
|
|||
#!/usr/bin/xonsh
|
||||
from configparser import ConfigParser
|
||||
|
||||
config = ConfigParser()
|
||||
CONFIG_PATH = "$(pwd)/.banana"
|
||||
if not isfile(CONFIG_PATH):
|
||||
echo "banana-runner: no config found!")
|
||||
exit 1
|
||||
config.read(CONFIG_PATH)
|
||||
sections = config.sections()
|
||||
|
||||
sections.remove('$')
|
||||
|
||||
if len($($!)) == 1 or $($1) == '$':
|
||||
echo 'banana-runner: no arguments given'
|
||||
|
||||
|
15
goto/README.md
Normal file
15
goto/README.md
Normal file
|
@ -0,0 +1,15 @@
|
|||
# Goto
|
||||
I don't like how jump works, so I made a different solution: I got tired of using cd to go through structured directories for development, so my `goto` uses a `.goto` ini file in the root directory of a project to store aliases for directories. For a sample configuration:
|
||||
|
||||
```ini
|
||||
[goto]
|
||||
root = .
|
||||
foo = ./some/long/directory/path/
|
||||
bar = ./some/other/long/path/
|
||||
```
|
||||
|
||||
`goto foo` replaces `cd some/long/directory/path/`, and from `some/long/directory/path/` to get back to the "root" we put the file at, `goto root` replaces `cd ../../../../`.
|
||||
|
||||
## Installing goto
|
||||
|
||||
just move the two scripts into `/usr/lib/goto/` and add `source /usr/lib/goto/goto.sh` to your shell `rc` file.
|
19
goto/goto.sh
Executable file
19
goto/goto.sh
Executable file
|
@ -0,0 +1,19 @@
|
|||
#!/bin/bash
|
||||
|
||||
function goto() {
|
||||
if [ "$1" == "-l" ]; then
|
||||
/usr/lib/goto/resolve "$@"
|
||||
return
|
||||
fi
|
||||
if [[ $# > 1 ]]; then
|
||||
for name in "$@"
|
||||
do
|
||||
jump=$(/usr/lib/goto/resolve "$name")
|
||||
builtin cd "$jump"
|
||||
done
|
||||
return
|
||||
fi
|
||||
td=$(/usr/lib/goto/resolve "$@")
|
||||
builtin cd "$td"
|
||||
return
|
||||
}
|
35
goto/resolve
Executable file
35
goto/resolve
Executable file
|
@ -0,0 +1,35 @@
|
|||
#!/usr/bin/python
|
||||
from configparser import ConfigParser
|
||||
from os import chdir, getcwd
|
||||
from os.path import isfile
|
||||
from pathlib import Path
|
||||
from signal import signal, SIGPIPE, SIG_DFL
|
||||
from sys import argv
|
||||
|
||||
config = ConfigParser()
|
||||
FILE = f'{getcwd()}/.goto'
|
||||
while not isfile(FILE):
|
||||
if(getcwd() == '/'):
|
||||
exit()
|
||||
else:
|
||||
chdir(Path(getcwd()).parent)
|
||||
FILE = f'{getcwd()}/.goto'
|
||||
config.read(FILE)
|
||||
places = config['goto']
|
||||
|
||||
if len(argv) == 0:
|
||||
exit()
|
||||
|
||||
if argv[1] == '-l' or argv[1] == '--list':
|
||||
for title in places:
|
||||
print(f'{title} -> {places[title]}')
|
||||
exit()
|
||||
|
||||
if argv[1] not in places:
|
||||
exit()
|
||||
|
||||
path = places[argv[1]]
|
||||
if path.startswith('./'):
|
||||
path = f'{str(Path(FILE).parent)}/{path[2:]}'
|
||||
signal(SIGPIPE, SIG_DFL)
|
||||
print(path)
|
14
inet/README.md
Normal file
14
inet/README.md
Normal file
|
@ -0,0 +1,14 @@
|
|||
# Networking-related scripts
|
||||
|
||||
## is-back
|
||||
|
||||
Pings `archlinux.org` until successful. Sends a notification when it is.
|
||||
|
||||
## myip
|
||||
|
||||
Check a device's IP address with way less typing.
|
||||
|
||||
## weather
|
||||
|
||||
Just curls [wttr.in](https://wttr.in) with the location stored in `~/.config/weather_location`.
|
||||
|
12
inet/is-back
Executable file
12
inet/is-back
Executable file
|
@ -0,0 +1,12 @@
|
|||
#!/usr/bin/bash
|
||||
|
||||
while true; do
|
||||
if (ping archlinux.org -W 5 -c 1); then
|
||||
echo "Ping responded; internet is up."
|
||||
notify-send "Internet is up." --app-name="Ping Test" --icon="$(pwd)/is-back-icon.png"
|
||||
exit 0
|
||||
else
|
||||
continue
|
||||
fi
|
||||
done
|
||||
|
BIN
inet/is-back-icon.png
Normal file
BIN
inet/is-back-icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.4 KiB |
3
inet/myip
Executable file
3
inet/myip
Executable file
|
@ -0,0 +1,3 @@
|
|||
#!/usr/bin/bash
|
||||
ip addr | grep -Po '\d+\.\d+\.\d+\.\d+/24' | awk '{ print substr($1, 0, length($1) - 3) }'
|
||||
|
6
inet/weather
Executable file
6
inet/weather
Executable file
|
@ -0,0 +1,6 @@
|
|||
#!/usr/bin/bash
|
||||
|
||||
location="$(cat ~/.config/weather_location)"
|
||||
|
||||
curl "https://wttr.in/$location?0mQ"
|
||||
|
36
mountain/mountain
Executable file
36
mountain/mountain
Executable file
|
@ -0,0 +1,36 @@
|
|||
#!/usr/bin/bash
|
||||
|
||||
TEXT=$(/usr/lib/mountain/mountain-handle $1)
|
||||
CODE=$?
|
||||
|
||||
if [[ $CODE -eq 1 ]]; then
|
||||
echo "mountain: no device supplied"
|
||||
exit 1
|
||||
elif [[ $CODE -eq 2 ]]; then
|
||||
echo "mountain: no settings for \"$1\""
|
||||
exit 2
|
||||
fi
|
||||
|
||||
read -t 1 -ra PROP <<< $TEXT
|
||||
DEV=${PROP[0]}
|
||||
DIR=${PROP[1]}
|
||||
|
||||
mount | grep "$DEV" >> /dev/null
|
||||
EXISTS=$?
|
||||
|
||||
if [[ "$2" == "u" ]]; then
|
||||
if [[ $EXISTS -ne 0 ]]; then
|
||||
echo "mountain: $DEV is not mounted"
|
||||
exit 2
|
||||
fi
|
||||
echo "Unmounting $DIR"
|
||||
sudo umount $DIR
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [[ $EXISTS -ne 1 ]]; then
|
||||
echo "mountain: $DEV is already mounted"
|
||||
exit 2
|
||||
fi
|
||||
echo "Mounting $DEV at $DIR"
|
||||
sudo mount $DEV $DIR
|
24
mountain/mountain-handle
Executable file
24
mountain/mountain-handle
Executable file
|
@ -0,0 +1,24 @@
|
|||
#!/usr/bin/python
|
||||
from configparser import ConfigParser
|
||||
from os import environ
|
||||
from os.path import expanduser
|
||||
from sys import argv
|
||||
|
||||
if len(argv) == 1:
|
||||
exit(1)
|
||||
|
||||
config = ConfigParser()
|
||||
CONFIG_PATH = expanduser("~/.config/mountain.ini")
|
||||
config.read(CONFIG_PATH)
|
||||
sections = config.sections()
|
||||
|
||||
name = argv[1]
|
||||
if name not in sections:
|
||||
exit(2)
|
||||
|
||||
if config.has_option(name, "alias"):
|
||||
name = config[name]["alias"]
|
||||
|
||||
dev = config[name]["dev"]
|
||||
dir = config[name]["dir"]
|
||||
print(dev, dir)
|
5
run/README.md
Normal file
5
run/README.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
# run
|
||||
|
||||
Dead-simple script to run `./.run` with all arguments passed through (`$@` in bash).
|
||||
I mostly use it for build scripts and running games.
|
||||
|
10
run/run
Executable file
10
run/run
Executable file
|
@ -0,0 +1,10 @@
|
|||
#!/bin/bash
|
||||
|
||||
if [[ -f ./.run ]]; then
|
||||
./.run $@
|
||||
exit $?
|
||||
else
|
||||
echo "run: ./.run does not exist"
|
||||
exit 1
|
||||
fi
|
||||
|
Loading…
Reference in a new issue