Skip to content

Go rewrite of the moreutils command-line tools

License

Notifications You must be signed in to change notification settings

gabe565/moreutils-go

Use this GitHub action with your project
Add this Action to an existing workflow or create a new one
View on Marketplace

Repository files navigation

moreutils-go

GitHub release (latest by date) Build Go Report Card

A Go rewrite of moreutils: A collection of the Unix tools that nobody thought to write long ago when Unix was young.

Some of the original moreutils commands require Perl, so I decided to rewrite them in a language which can compile into a single binary with no dependencies.

Applets

  • chronic: Runs a command quietly unless it fails
  • combine: Combine sets of lines from two files using boolean operations
  • errno: Look up errno names and descriptions
  • ifdata: Get network interface info without parsing ifconfig output
  • ifne: Run a command if the standard input is not empty
  • isutf8: Check whether files are valid UTF-8
  • mispipe: Pipe two commands, returning the exit status of the first
  • parallel: Run multiple jobs at once
  • pee: Tee standard input to pipes
  • sponge: Soak up standard input and write to a file
  • ts: Timestamp standard input
  • vidir: Edit a directory in your text editor
  • vipe: Insert a text editor into a pipe
  • zrun: Automatically decompress arguments to command

Installation

APT (Ubuntu, Debian)

Click to expand
  1. If you don't have it already, install the ca-certificates package

    sudo apt install ca-certificates
  2. Add gabe565 apt repository

    echo 'deb [trusted=yes] https://apt.gabe565.com /' | sudo tee /etc/apt/sources.list.d/gabe565.list
    
  3. Update apt repositories

    sudo apt update
  4. Install moreutils-go

    sudo apt install moreutils-go

RPM (CentOS, RHEL)

Click to expand
  1. If you don't have it already, install the ca-certificates package

    sudo dnf install ca-certificates
  2. Add gabe565 rpm repository to /etc/yum.repos.d/gabe565.repo

    [gabe565]
    name=gabe565
    baseurl=https://rpm.gabe565.com
    enabled=1
    gpgcheck=0
  3. Install moreutils-go

    sudo dnf install moreutils-go

AUR (Arch Linux)

Click to expand

Install moreutils-go-bin with your AUR helper of choice.

Homebrew (macOS, Linux)

Click to expand

Install moreutils-go from gabe565/homebrew-tap:

brew install gabe565/tap/moreutils-go

GitHub Actions

Click to expand

This repository can be added to a GitHub Actions workflow to install the applets.

Example

name: Example

on: push

jobs:
  example:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: gabe565/moreutils-go@v0
      - run: echo hello world | ts

Docker

Click to expand

A Docker image is available at ghcr.io/gabe565/moreutils

In this container, all applets are in the root directory.

In a Terminal

Some commands can be run directly from a terminal:

echo hello world | docker run --rm -i ghcr.io/gabe565/moreutils ts

While Building a Container

If you are building a container and need one of the applets, you can copy them directly to your container during build:

FROM alpine
COPY --from=ghcr.io/gabe565/moreutils:0 /usr/bin/ts /usr/bin
CMD echo hello world | ts

Manual Installation

Click to expand
  1. Download and run the latest release binary for your system and architecture.
  2. Extract the binary and place it in the desired directory.
  3. Run moreutils install -sr DIRECTORY to generate symlinks for each command.

Differences

My goal is 100% compatability, but there are currently some differences compared to moreutils:

Applet Differences
errno The original implementation prints some errors which are not used by the current OS. For example, code 35 could match EAGAIN and EWOULDBLOCK. Most operating systems only use one or the other, so this implementation does not print duplicates.
ifdata The rewrite supports the -ph and -pf flags on all operating systems, and all statistics flags on Linux and Darwin.
isutf8 Unlike moreutils, which prints the expected value range for non-UTF-8 files, the rewrite only logs the offending line, byte, and char.
lckdo Deprecated in moreutils and intentionally not implemented here. It is recommended to use flock as a replacement.
parallel Parallel is not symlinked by default since GNU Parallel is typically preferred.
ts The -m flag does not affect functionality since Go always uses the system's monotonic clock.