COSH adalah cangkang baris perintah concatenative.
Operasi shell dasar seperti ls
, ps
, stat
, dan sebagainya diimplementasikan sebagai fungsi yang mengembalikan nilai kelas satu, yang bertentangan dengan mengandalkan yang dapat dieksekusi yang mengembalikan aliran teks. Ini membuat bekerja dengan hasil lebih sederhana:
Temukan jalur file yang cocok dengan string, dan cari file tersebut untuk data
sh | menemukan . -iname '*tes*' -print0 | XARGS -0 Data GREP |
tongkat pendek | LSR; [tes m] grep; [f <; [data m] grep] peta |
Temukan semua proses menggunakan lebih dari 500m memori:
sh | PS ---No-headers aux | AWK '$ 6> 500000' |
tongkat pendek | PS; [MEM mendapatkan; 1000 1000 *; 500 *; >] grep |
Sejumlah kecil primitif serbaguna berarti bahwa lebih sedikit yang perlu diingat jika dibandingkan dengan cangkang khas (lihat misalnya berbagai bendera untuk cut(1)
), meskipun beberapa perintah mungkin lebih panjang sebagai hasilnya:
Dapatkan kolom kedua dan ketiga dari setiap baris file CSV:
sh | cut -d, -f2,3 uji -data/csv |
tongkat pendek | Test-Data/CSV F <; [Chomp; , membelah; (1 2) dapatkan] peta |
Urutkan file berdasarkan waktu modifikasi:
sh | ls -tr |
tongkat pendek | ls; [[stat; mTime get] 2 berlaku; <=>] sortp |
Operator aritmatika dan fungsi pengkodean/decoding XML/JSON/YAML/CSV mengurangi berapa kali perlu menggunakan bahasa pemrograman yang lebih lengkap atau yang dapat dieksekusi pihak ketiga:
Nomor poin floating increment dalam file:
sh | Sed 's/$/+10/' nums | bc |
tongkat pendek | nums f <; [Chomp; 10 +] Peta |
Dapatkan nilai pertama dari anggota array "ZXCV" dari file JSON:
sh | jq .zxcv [0] uji-data/json2 |
tongkat pendek | uji-data/json2 f <; dari-json; ZXCV dapatkan; 0 dapatkan |
Ini juga terintegrasi dengan panggilan eksekusi eksternal, di mana itu perlu:
Cetak Data Sertifikat:
pesta | untuk saya di `temukan. -iname '*.pem'`; do openssl x509 -in $ i -text -noout; Selesai |
tongkat pendek | LSR; [PEM $ M] grep; [{OpenSSL x509 -in {} -text -noout}] peta; |
Lihat dokumentasi lengkap untuk detail lebih lanjut.
Ini telah diuji di Linux (Debian 12), tetapi harus bekerja pada sistem Linux/MacOS/BSD di mana karat dapat dibangun.
make
make test
sudo make install
Terlepas dari Core cosh
yang dapat dieksekusi, ini juga akan menginstal perpustakaan fungsi inti ( rt.chc
) yang dikompilasi.
user@host:/$ cosh
/$ hello println;
hello
Setiap contoh dimulai dari direktori klon repositori.
Daftar file dalam direktori yang ditentukan:
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$
Urutkan file secara abjad dalam direktori yang ditentukan:
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$
Perintah eksternal dapat dijalankan dengan mengawali perintah dengan ruang:
cosh$ vim test-data/csv
...
Baca file ke dalam memori:
cosh$ test-data/csv f<;
v[gen (
0: "1,2,3,4n"
1: "5,6,7,8n"
2: "9,10,11,12n"
)]
cosh$
Untuk setiap baris file CSV, hapus newline dan pisahkan dengan koma:
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$
Baca file JSON ke dalam memori:
cosh$ test-data/json2 f<; from-json;
h(
"asdf": 1
"qwer": 2
"tyui": h(
"asdf": 5
)
"zxcv": (
0: 3
1: 4
)
)
cosh$
Dapatkan nama bidang dari file JSON, dan cetak ke output standar:
cosh$ test-data/json2 f<; from-json; keys; println for;
asdf
qwer
tyui
zxcv
cosh$
Temukan nama bidang yang cocok dengan regex yang diberikan:
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$
Tentukan dan gunakan fungsi baru:
cosh$ : add-5 5 +; ,,
cosh$ (1 2 3) add-5 map;
(
0: 6
1: 7
2: 8
)
cosh$
Menangkap nilai menggunakan 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$
Cetak waktu modifikasi jalur dalam format tertentu:
cosh$ test-data stat; mtime get; from-epoch; %F strftime;
2023-01-20
cosh$
Temukan waktu ping untuk serangkaian nama domain, secara paralel:
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$
Dapatkan jumlah total host dalam satu set rentang alamat IP:
cosh$ (1.0.0.0/24 2.0.0.0/14 3.0.0.0/8) [ip; ip.size] map; sum
17039616
cosh$
Buat database SQLite baru, tambahkan tabel ke database, dan tambahkan catatan ke tabel:
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$
Dokumentasi
Lihat lisensi.