blog: new post: The Beautiful in the Ugly
This commit is contained in:
parent
01501d2522
commit
617cede28d
|
@ -0,0 +1,88 @@
|
||||||
|
---
|
||||||
|
title: The Beautiful in the Ugly
|
||||||
|
date: 2018-04-23
|
||||||
|
for: Silver
|
||||||
|
---
|
||||||
|
|
||||||
|
# The Beautiful in the Ugly
|
||||||
|
|
||||||
|
Functional programming is nice and all, but sometimes you just need to have
|
||||||
|
things get done regardless of the consequences. Sometimes a dirty little hack
|
||||||
|
will suffice in place of a branching construct. This is a story of one of these
|
||||||
|
times.
|
||||||
|
|
||||||
|
In shell script, bare words are interpreted as arbitrary commands for the shell
|
||||||
|
to run, interpreted in its rules (simplified to make this story more interesting):
|
||||||
|
|
||||||
|
1. The first word in a command is the name or path of the program being loaded
|
||||||
|
2. Variable expansions are processed before commands are executed
|
||||||
|
|
||||||
|
Given the following snippet of shell script:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
#!/bin/sh
|
||||||
|
# hello.sh
|
||||||
|
|
||||||
|
function hello {
|
||||||
|
echo "hello, $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
$1 $2
|
||||||
|
```
|
||||||
|
|
||||||
|
When you run this without any arguments:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ sh ./hello.sh
|
||||||
|
$
|
||||||
|
```
|
||||||
|
|
||||||
|
Nothing happens.
|
||||||
|
|
||||||
|
Change it to the following:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ sh ./hello.sh hello world
|
||||||
|
hello, world
|
||||||
|
$ sh ./hello.sh ls
|
||||||
|
hello.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Shell commands are bare words. Variable expansion can turn into execution.
|
||||||
|
Normally, this is terrifying. This is useful in fringe cases.
|
||||||
|
|
||||||
|
Consider the following script:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
#!/bin/sh
|
||||||
|
# build.sh <action> [arguments]
|
||||||
|
|
||||||
|
projbase=github.com/Xe/printerfacts
|
||||||
|
|
||||||
|
function gitrev {
|
||||||
|
git rev-parse HEAD
|
||||||
|
}
|
||||||
|
|
||||||
|
function app {
|
||||||
|
export GOBIN="$(pwd)"/bin
|
||||||
|
go install github.com/Xe/printerfacts/cmd/printerfacts
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_system {
|
||||||
|
app
|
||||||
|
|
||||||
|
cp ./bin/printerfacts /usr/local/bin/printerfacts
|
||||||
|
}
|
||||||
|
|
||||||
|
function docker {
|
||||||
|
docker build -t xena/printerfacts .
|
||||||
|
docker build -t xena/printerfacts:"$(gitrev)"
|
||||||
|
}
|
||||||
|
|
||||||
|
function deploy {
|
||||||
|
docker tag xena/printerfacts:"$(gitrev)" registry.heroku.com/printerfacts/web
|
||||||
|
docker push registry.heroku.com/printerfacts/web
|
||||||
|
}
|
||||||
|
|
||||||
|
$*
|
||||||
|
```
|
Loading…
Reference in New Issue