2016-04-09 23 views
0

Ich bin auf der Suche nach einem einfachen Befehl, mit dem ich einen Terminal-Alias ​​zu einem anderen Befehl von der Befehlszeile erstellen und vorzugsweise verwenden, ohne mein Terminal neu starten zu müssen.Befehl zum einfachen Erstellen von Alias ​​

Der Anwendungsfall ist wie folgt, ich habe gerade ein kleines Bash-Skript erstellt und es auf Gist.

# Babel in your project 
npm i json -g 
npm install --save-dev babel-core babel-cli babel-preset-es2015 babel-preset-react 
json -f package.json -I -e 'this.scripts.test = "mocha --compilers js:babel-core/register --recursive"' 
json -f package.json -I -e 'this.babel = {}' 
json -f package.json -I -e 'this.babel.presets = ["es2015", "react"]' 
json -f package.json -I -e 'this.main = "./lib/index"' 
json -f package.json -I -e 'this.esnext = "./src/index"' 

Ich kann es hier vom Terminal wie folgt ausführen:

bash -c "$(curl -fsSL https://gist.githubusercontent.com/reggi/8035dcbdf0fb73b8c8703a4d244f15cf/raw/767ec8c2fb54b554ce122cc85953da5b277dbaf4/babel-ready.sh)" 

Ich bin neugierig, wenn eine es leicht Weg, um einen alias vom Terminal zu erstellen. Etwas Einfaches wie:

add-alias babel-ready -- bash -c "$(curl -fsSL https://gist.githubusercontent.com/reggi/8035dcbdf0fb73b8c8703a4d244f15cf/raw/767ec8c2fb54b554ce122cc85953da5b277dbaf4/babel-ready.sh)" 
+3

Was genau wollen Sie 'add-alias' zu tun? Wenn es den Alias ​​zu ".bashrc" hinzufügen und in der aktuellen Shell verfügbar machen soll, ist das nicht ganz trivial. Wenn es nur einen Alias ​​in der aktuellen Shell erstellen soll, verwenden Sie einfach "Alias", nicht wahr? Wenn der Alias ​​der aktuellen Shell hinzugefügt werden soll, muss er selbst ein Alias ​​(Funktion? Oder) sein. –

+0

@ JonathanLeffler Ich möchte einen permanenten globalen Alias. Was meinst du mit nicht ganz trivial? – ThomasReggi

+0

@ThomasReggi, es wäre einfach, Ihnen eine Antwort zu geben, die für * die meisten * Systeme und Konfigurationen funktioniert, aber eine Antwort, die * immer * funktioniert (und idealerweise idempotent ist, dh nicht Ihre 'bashrc'-Datei ändert, wenn Der Aliasname existiert bereits. Sie müssen in der Lage sein, den Codefluss Ihrer RC-Dateien zu analysieren und zu verstehen, was nahezu unmöglich ist. –

Antwort

0

Ein grober Versuch (nicht Flow-Control bewusst, nicht idempotent, nicht in der Lage zu erkennen und alte Versionen des gleichen Alias ​​entfernen) könnte wie folgt aussehen:

# non-POSIX-compliant function keyword used to allow dash in function name 
function add-alias() { 
    # declare locals explicitly to prevent scope leakage 
    local content_line cmd 

    (($# == 1)) && [[ $1 ]] || { 
    echo "Usage: add_alias name" >&2 
    return 1 
    } 
    IFS= read -r content_line 

    # reject inputs containing newlines 
    content_line=${content_line%$'\n'} 
    if [[ $content_line = *$'\n'* ]]; then 
    echo "ERROR: Only one line may be provided" >&2 
    return 1 
    fi 

    # generate a command 
    printf -v cmd "alias %q=%q" "$1" "$content_line" 

    # eval it in the local shell, and add to the rc if that succeeds 
    eval "$cmd" && printf '%s\n' "$cmd" >>"$HOME/.bashrc" 
} 

... als:

add-alias babel-ready <<'EOF' 
bash -c "$(curl -fsSL https://gist.githubusercontent.com/reggi/8035dcbdf0fb73b8c8703a4d244f15cf/raw/767ec8c2fb54b554ce122cc85953da5b277dbaf4/babel-ready.sh)" 
EOF 

Beachten Sie die Verwendung von <<'EOF' - unter Angabe der heredoc ist wichtig, Dies verhindert, dass Erweiterungen ausgeführt werden, wenn der Alias ​​definiert wird (im Gegensatz zu dem, wenn er ausgeführt wird). Aus diesem Grund verwendet die Verwendung Code auf stdin und nicht auf der Befehlszeile, wodurch der Benutzer dafür verantwortlich ist, Befehlszeilenargumente entsprechend zu zitieren.

Verwandte Themen