You are not logged in.
The script is, it's just assuming echo has an -e flag which is a safe assumption on an arch system - in fact I don't know if there is an implementation of echo available in the repos that doesn't support the -e flag.
"UNIX is simple and coherent" - Dennis Ritchie; "GNU's Not Unix" - Richard Stallman
Offline
I don't know whether it counts, but the tcsh built-in does not support it:
$ tcsh
> which echo
echo: shell built-in command.
> echo -en Hello
-en Hello
>
Inofficial first vice president of the Rust Evangelism Strike Force
Offline
@Trilby, True, but far as I know flags for echo are not defined in POSIX.
So how would you change that than?
Last edited by qinohe (2021-01-17 19:43:27)
Offline
I didn't suggest changing anything. I just rejected your claim that the script isn't POSIX. "systemd-analyze" and "journalctl" are also not defined in POSIX, that doesn't mean the script isn't POSIX compliant. The script doesn't use any shell features that are not provided by POSIX unless your /bin/sh includes a built in echo that doesn't have -e. I wasn't aware of tcsh's echo, but I don't think tcsh could/should provide a /bin/sh as tcsh is most definitely not POSIX.
"UNIX is simple and coherent" - Dennis Ritchie; "GNU's Not Unix" - Richard Stallman
Offline
Okay I follow your rationale, but than I'm always trying to follow the rules for POSIX to precise.
I mean it would be safe to say the script should contain a line 'Arch only' for I think there enough distro's/OS's following POSIX strict?
Offline
Is that a question? There are far more distros that would fail on due to not running systemd than to not having echo's -e flag. Do you know of any?
"UNIX is simple and coherent" - Dennis Ritchie; "GNU's Not Unix" - Richard Stallman
Offline
Do you know of any?
It's not a distribution but OpenBSD's echo(1) doesn't support it:
~$ /bin/echo -e '/thello'
-e /thello
~$
And yes, the systemd commands would also fail for that operating system :-)
Para todos todo, para nosotros nada
Offline
There are far more distros that would fail on due to not running systemd than to not having echo's -e flag. Do you know of any?
That's true, the OS part in my previous part had to do with 'echo' only, BSD don't run systemd ... sure, but it handles 'echo' strictly POSIX.
I don't know of any distro running 'echo' without the -e flag, no. So, it's save to assume the script is POSIX for most shells that is.
Still, I would suggest to use 'printf' in OP's script (for it's formatting) but that's beside the POSIX discussion.
edit: HoaS said it too. was getting coffee, what to do without coffee...;)
edit: @Ferdinand,
I missed the 'last login' command, 5 pipes...;)
Maybe you can do it in one but:
last | grep -v reboot | awk '{print $1" " $3" "$4" " $5" " $6" " $7} NR == 5{exit}'
Last edited by qinohe (2021-01-17 21:42:17)
Offline
I didn't suggest changing anything. I just rejected your claim that the script isn't POSIX. "systemd-analyze" and "journalctl" are also not defined in POSIX, that doesn't mean the script isn't POSIX compliant. The script doesn't use any shell features that are not provided by POSIX unless your /bin/sh includes a built in echo that doesn't have -e. I wasn't aware of tcsh's echo, but I don't think tcsh could/should provide a /bin/sh as tcsh is most definitely not POSIX.
The systemd-analyze and journalctl utilities are undefined by POSIX, which means a POSIX-compliant script can call them without violating POSIX since POSIX lets you run utilities from anywhere.
However, "echo -e" is a violation of POSIX, because the echo utility is defined by POSIX: https://pubs.opengroup.org/onlinepubs/9 … /echo.html
And per its definition,
Implementations shall not support any options.
[...]
If the first operand is -n, or if any of the operands contain a <backslash> character, the results are implementation-defined.
Hence, per POSIX,
echo -e "\nWelcome to `hostname`: `uname -o` `uname -r` (`uname -m`)\n"
is required to print something like:
-e \nWelcome to myhostname: GNU/Linux 5.10.7-arch1-1 (x86_64)\n
POSIX does provide the escape hatch "if you use the option -n, it's technically-not-an-option and you may do whatever; we throw our hands up in disgust". Furthermore, on XSI-conformant systems, you may optionally rely on it instead printing:
-e
Welcome to myhostname: GNU/Linux 5.10.7-arch1-1 (x86_64)
https://www.austingroupbugs.net/view.php?id=1222#c4375
The next (future) edition of POSIX will extend the undefined nature of -n to apply to -e as well, in a nod to the fact that this exists in the wild and will NEVER be standardized, but should be documented in order that all shall know how unreliable it is.
Managing AUR repos The Right Way -- aurpublish (now a standalone tool)
Offline
My Anti-POSIX version of that in Go
Edit: Replaced Zenity with Kdialog because I'm a KDE guy
package main
import (
"bytes"
"fmt"
"log"
"os/exec"
"strings"
"syscall"
"time"
)
func main() {
//This would typically go in .xprofile
//Build up a status message and present it with kdialog
welcome := bytes.NewBuffer(nil)
// Boot info
uname := syscall.Utsname{}
err := syscall.Uname(&uname)
if err != nil {
log.Fatal(err)
}
fmt.Fprintf(welcome, "Welcome to %s: %s %s (%s)\n",
str(uname.Nodename[:]),
str(uname.Sysname[:]),
str(uname.Release[:]),
str(uname.Machine[:]))
fmt.Fprintln(welcome, "\nLast boot:\n----------")
last := try("last", "reboot", "--limit", "1")
date := strings.Fields(string(last))[4:8]
fmt.Fprintf(welcome, "%s\n\n", strings.Join(date, " "))
analyze := try("systemd-analyze")
analyze = bytes.Replace(analyze, []byte("graphical"), []byte("Graphichal"), 1)
fmt.Fprintf(welcome, "%s\n", analyze)
// Boot errors
fmt.Fprintln(welcome, "Boot errors:\n-------")
critical := try("journalctl", "-r", "-b", "--no-pager", "-p", "err", "-q")
if len(critical) == 0 {
fmt.Fprintln(welcome, "no errors detected")
} else {
fmt.Fprintf(welcome, "%s\n", critical)
}
// Failed systemd units
fmt.Fprintln(welcome, "Failed units:\n-------------")
failed := try("systemctl", "--failed")
fmt.Fprintf(welcome, "%s\n", failed)
// Last logins
fmt.Fprintln(welcome, "Last logins:\n------------")
last = try("last")
var i int
for _, entry := range strings.Split(string(last), "\n") {
if i == 5 {
break
}
if strings.Contains(entry, "reboot") {
continue
}
fields := strings.Fields(entry)
entry = fields[0] + "\t" + strings.Join(fields[2:7], " ")
fmt.Fprintln(welcome, entry)
i++
}
fmt.Fprintln(welcome, "\nNice to see you!")
kdialog := exec.Command("kdialog", "--textbox", "-", "1150", "800")
kdialog.Stdin = welcome
kdialog.Run()
}
func str(arr []int8) string {
b := make([]byte, 0, len(arr))
for _, v := range arr {
if v == 0x00 {
break
}
b = append(b, byte(v))
}
return string(b)
}
func try(name string, args ...string) (out []byte) {
var err error
for {
out, err = exec.Command(name, args...).Output()
if err == nil {
break
}
time.Sleep(time.Second)
}
return out
}
Last edited by ugjka (2021-01-18 15:24:09)
https://ugjka.net
paru > yay | vesktop > discord
pacman -S spotify-launcher
mount /dev/disk/by-...
Offline
I have to thank you guys I realize I'm sloppy with my scripting
I'm search and replacing back-ticks and echos through my brains now - and thank's for the awk tips @qinohe; I've always shunned awk, but realize it might be a tad like walking away from gold just because it's heavy
Replacing g with G is sillybilly I agree, but I think the output used to be on one line? (I think I used to replace with \nGraphical)
Also I think zenity doesn't quite cut it, so I'll try with xmessage, gxmessage, xdialog or yad or something too
Last edited by Ferdinand (2021-01-18 15:59:48)
Offline
Learn some sed and awk, they are the glue in shell scripting and can make long scripts way shorter, very valuable tools!
I think it doesn't really matter what kind of dialog you use, it's just a matter of taste and easily replaced, you could even use dmenu...
Replace the cat command for zenity , use redirection, it's a useless cat.;)
command < "$var"
Offline
Here's a script I made to apply soft symlinks:
#!/bin/sh
symlink=$1
cp -r `readlink -f $symlink && rm $symlink` $symlink
C is a nice language. Semicolon.
Offline
What happens if you run that on a file that's not a symlink?
What happens if rm prints an error?
What happens if the filenames contain IFS?
Offline
Then you re-write it 3 times longer:
#!/bin/bash
error () { echo "$1"; exit 1; }
symlink="$1"
test -L "$symlink" || error "$symlink is not a symlink."
test -w "$symlink" || error "No write access to $symlink"
linked=$(readlink -f "$symlink")
test -r "$linked" || error "No read access to $linked"
rm "$symlink"
cp -r "$linked" "$sym"
Last edited by cajm (2021-01-19 14:56:54)
C is a nice language. Semicolon.
Offline
Based on some recommendations google spit out, here is my bash script using youtube-dl that downloads Audio from Youtube and splits it into one file per video chapter.
#!/bin/bash
url="$1"
basename=$(youtube-dl --dump-single-json "$url" | jq .title | tr -cd '[:alnum:]')
downloads="~/Downloads/_youtube-dl/"
mkdir -p "$downloads"/"$basename"
cd "$downloads"/"$basename"
youtube-dl --write-info-json -x --audio-format mp3 -o "$basename.%(ext)s" "$url"
jq '.chapters[] | .start_time,.end_time-.start_time,.title ' < $basename.info.json | xargs -n3 -d'\n' | awk '{print NR" "$s}' > chapters
while read -r track start duration title; do
title=${title//\"/}
ffmpeg -loglevel warning -nostdin -y -ss "$start" -t "$duration" -i "$basename.mp3" -codec:a copy "$track - $title.mp3"
done < chapters
It doesn't clean up after itself and probably doesn't handle errors very well.
Offline
You know youtube-dl will do all that itself with a single command. Just use the -o flag with an output template using either the chapter name or number placeholders, and it will split chapters into separate files each named according to the template.
"UNIX is simple and coherent" - Dennis Ritchie; "GNU's Not Unix" - Richard Stallman
Offline
That must be new. When I was looking up how to split chapters a few weeks ago, support for yt chapters were still an open bug report/feature request. I'll investigate.
Offline
There's also https://archlinux.org/packages/extra/x86_64/mp3splt/ - no chapters needed if there're reasonable silence…
Offline
NB: I've never used it for this myself, but there is an example in the man page specifically for such a use (it separates chapters into separate directories).
"UNIX is simple and coherent" - Dennis Ritchie; "GNU's Not Unix" - Richard Stallman
Offline
Chapters (new youtube feature) or playlist items?
Offline
The documentation indicates chapters, and it has a different template variable name for these chapters than it does for different playlist items.
"UNIX is simple and coherent" - Dennis Ritchie; "GNU's Not Unix" - Richard Stallman
Offline
Couldn't figure out how to make systemd wait till certain zeroconf host becomes resolvable. So wrote a lil Go util that just does that and exits when there are no errors
package main
import (
"net"
"os"
"time"
)
func main() {
remote := os.Args[1]
for {
if _, err := net.ResolveIPAddr("ip", remote); err == nil {
break
}
time.Sleep(time.Second)
}
}
Now in systemd unit
[Unit]
Description=extend mouse to my ircbox
Wants=network-online.target
After=network.target network-online.target
[Service]
ExecStartPre=/usr/local/bin/waitonline ircbox.local
ExecStart=/usr/bin/ssh -X ircbox.local x2x -east -to :0.0 -nosel -completeregionup 256
Restart=always
RestartSec=5
Environment="DISPLAY=:0"
Environment="XAUTHORITY=/home/ugjka/.Xauthority"
[Install]
WantedBy=default.target
https://ugjka.net
paru > yay | vesktop > discord
pacman -S spotify-launcher
mount /dev/disk/by-...
Offline
The documentation indicates chapters, and it has a different template variable name for these chapters than it does for different playlist items.
Whatever those chapters are, those don't work on youtube (but on other sites). The most recent release that did anything with chapters allowed youtube-dl to download the chapter meta data in the .info.json file. It does not automatically split Youtube videos.
Offline
Disable DPMS (screen blanking) if ALSA is currently playing sounds, or enable DPMS with 600s timeout if ALSA is currently not playing sounds.
Inspired by the fact that VLC no longer supresses DPMS and shuts my monitors off while I'm watching a movie (kernel or nvidia bug?)
Run in cron every 5 min (script is set at 10 min blanking timeout).
#!/bin/bash
# shellcheck disable=SC2155
set -euo pipefail
declare -ir _timeout=600
declare -ir _current="$(xset -display :0.0 q | awk '/Standby:/ { print $2 }')"
_enable() {
if [[ "${_current}" == "0" ]]
then
xset -display :0.0 dpms ${_timeout} ${_timeout} ${_timeout}
fi
}
_disable() {
if [[ "${_current}" != "0" ]]
then
xset -display :0.0 dpms 0 0 0
fi
}
if grep -q "RUNNING" /proc/asound/card*/pcm*/sub*/status
then
_disable
else
_enable
fi
Last edited by karabaja4 (2021-01-24 02:45:13)
Offline