Cosh ist eine verkettende Befehlszeilenschale.
Grundlegende Shell-Operationen wie ls
, ps
, stat
usw. werden als Funktionen implementiert, die erstklassige Werte zurückgeben, anstatt sich auf ausführbare Ausführungsfähigkeiten zu verlassen, die Textströme zurückgeben. Dies macht die Arbeit mit den Ergebnissen einfacher:
Finden Sie Dateipfade, die mit einer Zeichenfolge übereinstimmen, und durchsuchen Sie diese Dateien nach Daten
Sh | finden . -Iname '*test*' -print0 | xargs -0 Grep -Daten |
Cosh | LSR; [Test M] Grep; [F <; [Daten m] Grep] Karte |
Finden Sie alle Prozesse mit mehr als 500 m Speicher:
Sh | PS-No-Header Aux | awk '$ 6> 500000' |
Cosh | PS; [Mem bekommen; 1000 1000 *; 500 *; >] Grep |
Ein kleiner Satz vielseitiger Primitiven bedeutet, dass im Vergleich zu typischen Schalen weniger in Erinnerung bleiben muss (siehe zB den verschiedenen Flags für cut(1)
), obwohl einige Befehle als Ergebnis länger sein können:
Holen Sie sich die zweite und dritte Spalten aus jeder Zeile einer CSV -Datei:
Sh | Cut -d, -f2,3 Testdaten/CSV |
Cosh | Testdaten/CSV F <; [Chomp; , Teilt; (1 2) MAP RET] MAP |
Dateien nach Änderungszeit sortieren:
Sh | ls -tr |
Cosh | ls; [[stat; mtime Get] 2 bewerben sich; <=>] sortp |
Arithmetische Operatoren und XML/JSON/YAML/CSV-Codierungs-/Decodierungsfunktionen verringern die Anzahl der Male, in denen es erforderlich ist, eine mehr fettgefühlte Programmiersprache oder eine ausführbare Datei von Drittanbietern zu verwenden:
Inkrement-Schwimmpunktzahlen in der Datei:
Sh | sed 's/$/+10/' nums | BC |
Cosh | nums f <; [Chomp; 10 +] Karte |
Holen Sie sich den ersten Wert aus dem "ZXCV" -Array -Mitglied einer JSON -Datei:
Sh | JQ .ZXCV [0] Testdaten/JSON2 |
Cosh | Testdaten/JSON2 F <; From-Json; ZXCV GET; 0 bekommen |
Es wird auch in externe ausführbare Anrufe integriert, bei denen dies erforderlich ist:
Zertifikatdaten:
verprügeln | Denn ich in `finde. -Iname '*.pem'`; OpenSSL x509 -in $ i -text -nout; Erledigt |
Cosh | LSR; [Pem $ m] Grep; [{OpenSSL x509 -in {} -Text -noout}] map; |
Weitere Informationen finden Sie in der vollständigen Dokumentation.
Dies wurde an Linux (Debian 12) getestet, sollte jedoch auf einem Linux/macOS/BSD -System arbeiten, in dem Rost erstellt werden kann.
make
make test
sudo make install
Neben der ausführbaren cosh
wird auch eine kompilierte Bibliothek mit Kernfunktionen ( rt.chc
) installiert.
user@host:/$ cosh
/$ hello println;
hello
Jedes Beispiel beginnt mit dem Repository -Klonverzeichnis.
Listen Sie Dateien in einem bestimmten Verzeichnis auf:
cosh$ test-data ls
v[gen (
0: test-data/cert.der
1: test-data/json-bigint
2: test-data/json2
3: test-data/json1
4: test-data/readfile
5: test-data/yaml1.yml
6: test-data/test.ch
7: test-data/csv
8: test-data/split
9: test-data/readlines
)]
cosh$
Sortieren Sie die Dateien alphabetisch in einem bestimmten Verzeichnis:
cosh$ test-data ls; sort
(
0: test-data/cert.der
1: test-data/csv
2: test-data/json-bigint
3: test-data/json1
4: test-data/json2
5: test-data/readfile
6: test-data/readlines
7: test-data/split
8: test-data/test.ch
9: test-data/yaml1.yml
)
cosh$
Ein externer Befehl kann ausgeführt werden, indem der Befehl mit einem Speicherplatz vorangestellt wird:
cosh$ vim test-data/csv
...
Lesen Sie eine Datei in den Speicher:
cosh$ test-data/csv f<;
v[gen (
0: "1,2,3,4n"
1: "5,6,7,8n"
2: "9,10,11,12n"
)]
cosh$
Entfernen Sie für jede Zeile einer CSV -Datei die Newline und teilen Sie dies auf Kommas:
cosh$ test-data/csv f<; [chomp; , split] map;
v[gen (
0: (
0: 1
1: 2
2: 3
3: 4
)
1: (
0: 5
1: 6
2: 7
3: 8
)
2: (
0: 9
1: 10
2: 11
3: 12
)
)]
cosh$
Lesen Sie eine JSON -Datei in den Speicher:
cosh$ test-data/json2 f<; from-json;
h(
"asdf": 1
"qwer": 2
"tyui": h(
"asdf": 5
)
"zxcv": (
0: 3
1: 4
)
)
cosh$
Holen Sie sich die Feldnamen aus der JSON -Datei und drucken Sie sie auf Standardausgabe aus:
cosh$ test-data/json2 f<; from-json; keys; println for;
asdf
qwer
tyui
zxcv
cosh$
Finden Sie die Feldnamen, die einem bestimmten Regex entsprechen:
cosh$ test-data/json2 f<; from-json; keys; [.{4} m] grep;
v[gen (
0: asdf
1: qwer
2: tyui
3: zxcv
)]
cosh$
cosh$ test-data/json2 f<; from-json; keys; [a..f m] grep;
v[gen (
0: asdf
)]
cosh$
Definieren und verwenden Sie eine neue Funktion:
cosh$ : add-5 5 +; ,,
cosh$ (1 2 3) add-5 map;
(
0: 6
1: 7
2: 8
)
cosh$
Erfassen Sie einen Wert mit einem Regex:
cosh$ test-data ls;
v[gen (
0: test-data/json-bigint
1: test-data/json2
2: test-data/json1
3: test-data/readfile
4: test-data/csv
5: test-data/split
)]
cosh$ test-data ls; ["/.*" c; shift] map;
v[gen (
0: /json-bigint
1: /json2
2: /json1
3: /readfile
4: /csv
5: /split
)]
cosh$
Drucken Sie die Änderungszeit eines Pfades in einem bestimmten Format:
cosh$ test-data stat; mtime get; from-epoch; %F strftime;
2023-01-20
cosh$
Finden Sie die Ping Times für eine Reihe von Domainnamen parallel:
cosh$ (sourcehut.org github.com gitlab.com) [dup; A dig; answer.0.sdata.address get; 1 pingn; 0 get; 2 mlist] pmap;
v[channel-gen (
0: (
0: gitlab.com
1: h(
"icmp_seq": 1
"ttl": 58
"time_ms": 11.6
)
)
1: (
0: github.com
1: h(
"icmp_seq": 1
"ttl": 115
"time_ms": 28.4
)
)
2: (
0: sourcehut.org
1: h(
"icmp_seq": 1
"ttl": 52
"time_ms": 346
)
)
)]
cosh$
Holen Sie sich die Gesamtzahl der Hosts in einer Reihe von IP -Adressbereichen:
cosh$ (1.0.0.0/24 2.0.0.0/14 3.0.0.0/8) [ip; ip.size] map; sum
17039616
cosh$
Erstellen Sie eine neue SQLite -Datenbank, fügen Sie der Datenbank eine Tabelle hinzu und fügen Sie der Tabelle einen Datensatz hinzu:
cosh$ mydb touch
cosh$ mydb sqlite db.conn; c var; c !
cosh$ c @; "create table test (id, num)" db.prep; () db.exec
()
cosh$ c @; "insert into test values (?, ?)" db.prep; (1 2) db.exec
()
cosh$ c @; "select * from test" db.prep; () db.exec
(
0: h(
"id": 1
"num": 2
)
)
cosh$
Dokumentation
Siehe Lizenz.