Stank เป็นห้องสมุดและคอลเลกชันของยูทิลิตี้บรรทัดคำสั่งสำหรับการดมกลิ่นไฟล์เพื่อระบุสคริปต์เชลล์เช่น Bash, SH, ZSH, KSH และอื่น ๆ เมื่อเทียบกับไฟล์อื่น ๆ ที่น่าพึงพอใจเช่น RB, PY, PL.
เชื่อหรือไม่ว่าสคริปต์เชลล์นั้นยากที่จะเขียนได้ดีดังนั้นมันจึงเป็นนักพัฒนาที่จะเขียนสคริปต์เชลล์ในภาษาที่ปลอดภัยกว่าหรือทำเครื่องหมายสคริปต์ของคุณด้วยกองทัพนาว ปัญหาคือในโครงการขนาดใหญ่ไม่มีใครแน่ใจได้ว่าไฟล์ใดที่ซื่อสัตย์ต่อสคริปต์เชลล์ที่สอดคล้องกับ Posix ของ Dog Posix และเป็นผู้อ้างสิทธิ์ CSH, TCSH, FISH, ION, RC และ nonderivatives อื่น ๆ ส่วนใหญ่ของ Bash มักจะไม่เข้ากันได้ หากคุณมีความสุขมากพอที่จะติดตามมาก่อนขอ crackalackin ด้วยตัวอย่างผลไม้บางอย่าง dammit!
ระบบ Stank รวมถึงไลบรารี Stank Go รวมถึงยูทิลิตี้บรรทัดคำสั่งหลายอย่างเพื่อความสะดวก แอปพลิเคชัน stank สแกนไดเรกทอรีและไฟล์สำหรับสคริปต์เชลล์ที่ได้จาก POSIX และพิมพ์เส้นทางของพวกเขาออกแบบเป็นตัวกรองแบบสแตนด์อโลนที่สะดวกสำหรับคอลเล็กชั่นคอลเล็กชันขนาดใหญ่ของซอร์สโค้ด
$ cd examples
$ stank .
.profile
.shrc
.zlogin
... ยูทิลิตี้บรรทัดคำสั่ง stank จะค้นหาเส้นทางไฟล์สำหรับสคริปต์เชลล์ที่อาจรับประกันการตัดหญ้า
Stank รวมเข้ากับผ้าลินินภายนอกช่วยในการป้อนชุดพา ธ ไฟล์ที่มุ่งเน้นมากขึ้นเพื่อวิเคราะห์ภายในไดเรกทอรีโครงการขนาดใหญ่
$ stank -print0 . | xargs -0 -n 1 shellcheck
In welcome.sh line 1:
#!bash
^----^ SC2239 (error): Ensure the shebang uses an absolute path to the interpreter.
For more information:
https://www.shellcheck.net/wiki/SC2239 -- Ensure the shebang uses an absolu... ไฟล์ที่สร้างขึ้นของเครื่องรวมถึงไฟล์เริ่มต้นของ Git Hook *.sample จะถูกข้ามโดยอัตโนมัติ
ดู stank -help สำหรับตัวเลือกเพิ่มเติม
https://github.com/mcandre/stank/releases
$ go install github.com/mcandre/stank/...@latesthttps://pkg.go.dev/github.com/mcandre/stank
funk Linter รายงานกลิ่นแปลก ๆ ที่เล็ดลอดออกมาจากสคริปต์เช่นการสิ้นสุดของสายที่ไม่เหมาะสมการปรากฏตัวของเครื่องหมายคำสั่งไบต์ในสคริปต์ Unicode บางตัว
$ funk examples
Ambiguous launch style. Either feature a file extensions, or else feature executable bits: examples/.shrc
Tokenize like `unset IFS` at the top of executable scripts: examples/.shrc
Control program flow like `set -euf` at the top of executable scripts: examples/.shrc
Tokenize like `unset IFS` at the top of executable scripts: examples/badconfigs/zprofile
Control program flow like `set -euf` at the top of executable scripts: examples/badconfigs/zprofile
Missing shebang: examples/blank.bash
Traps may reset in subshells: examples/cleanup.sh
Missing shebang: examples/goodbye.sh
Missing shebang: examples/greetings.bash
Control program flow like `set -euf` at the top of executable scripts: examples/hello-commented
$ funk -modulino examples
Configuration features shebang: examples/badconfigs/.bash_profile
Configuration features executable permissions: examples/badconfigs/zprofile
Missing final end of line sequence: examples/blank.bash
Missing shebang: examples/blank.bash
Interpreter mismatch between shebang and extension: examples/derp.zsh
Missing shebang: examples/greetings.bash
Missing final end of line sequence: examples/hello-crlf.sh
CR/CRLF line ending detected: examples/hello-crlf.sh
Modulino ambiguity. Either have owner executable permissions with no extension, or else remove executable bits and use an extension like .lib.sh: examples/hello-crlf.sh
Modulino ambiguity. Either have owner executable permissions with no extension, or else remove executable bits and use an extension like .lib.sh: examples/howdy
Missing shebang: examples/howdy.zsh
Missing shebang: examples/just-eol.bash
Modulino ambiguity. Either have owner executable permissions with no extension, or else remove executable bits and use an extension like .lib.sh: examples/lo
Missing final end of line sequence: examples/lo-cr.csh
CR/CRLF line ending detected: examples/lo-cr.csh
Modulino ambiguity. Either have owner executable permissions with no extension, or else remove executable bits and use an extension like .lib.sh: examples/pipefail
Modulino ambiguity. Either have owner executable permissions with no extension, or else remove executable bits and use an extension like .lib.sh: examples/shout.sh
Modulino ambiguity. Either have owner executable permissions with no extension, or else remove executable bits and use an extension like .lib.sh: examples/wednesday
Modulino ambiguity. Either have owner executable permissions with no extension, or else remove executable bits and use an extension like .lib.sh: examples/wednesday-bom
Leading BOM reduces portability: examples/wednesday-bom
Modulino ambiguity. Either have owner executable permissions with no extension, or else remove executable bits and use an extension like .lib.sh: examples/welcome
$ funk -help
-cr
Report presence/absence of final end of line sequence (default true)
-eol
Report presence/absence of final end of line sequence (default true)
-help
Show usage information
-modulino
Enforce strict separation of application scripts vs. library scripts
-version
Show version information ทั้ง stank และ funk มีความสามารถในการเลือกสคริปต์ Nonposix ระดับต่ำเช่นสคริปต์ CSH/TCSH ที่ใช้ใน FreeBSD
โปรดทราบว่า Funk ไม่สามารถเตือนได้อย่างน่าเชื่อถือสำหรับการหายไปของ Shebangs หากส่วนขยายหายไปเช่นกัน โดยทั่วไปแล้วผู้เขียนสคริปต์จะใช้หนึ่งหรืออื่น ๆ เพื่อทำเครื่องหมายไฟล์เป็นสคริปต์เชลล์ การขาดทั้ง shebang และส่วนขยายไฟล์หมายความว่าไฟล์อาจมีรหัสสำหรับหลายภาษาทำให้ยากที่จะกำหนดลักษณะที่เป็น posixy ของรหัส แม้ว่าชุด ASTs ที่ครบถ้วนจะถูกนำไปใช้เพื่อทดสอบเนื้อหาไฟล์เพื่อความถูกต้องของ syntactical ในหลายสิบภาษาเชลล์ที่มีอยู่มีความเป็นไปได้ที่แข็งแกร่งในไฟล์ที่สั้นกว่าว่าเนื้อหานั้นเป็นเพียงไวยากรณ์สคริปต์ที่ถูกต้องโดยบังเอิญแม้ว่าความตั้งใจของไฟล์จะไม่ทำงาน สคริปต์สั้น ๆ nonposix เช่นสำหรับ CSH/TCSH สามารถกระตุ้นการจับคู่ไวยากรณ์ "POSIX" ได้อย่างง่ายดาย ไม่ว่าในกรณีใดก็ตามรู้ว่า Shebang เป็นสิ่งจำเป็นสำหรับการรับรองสคริปต์ของคุณได้รับการตีความอย่างถูกต้อง
โปรดทราบว่า Funk อาจล้มเหลวในการนำเสนอคำเตือนการอนุญาตหากสคริปต์อยู่ในระบบไฟล์ที่ไม่ใช่ Unix เช่น NTFS ซึ่งบิตที่สามารถเรียกใช้งานได้มักจะหายไปจากข้อมูลเมตาของไฟล์ทั้งหมด เมื่อจัดเก็บสคริปต์เชลล์ให้แน่ใจว่าได้ตั้งค่าสิทธิ์ไฟล์ที่เหมาะสมและถ่ายโอนไฟล์เป็นมัดใน tarball หรือคล้ายกับการป้องกันการอนุญาตที่ลดลง
โปรดทราบว่า Funk อาจเตือนความไม่ตรงกันของล่ามสำหรับสคริปต์ที่มีจุดภายนอกในชื่อไฟล์ แทนที่จะเป็น .envrc.sample ตั้งชื่อตัวอย่างไฟล์ sample.envrc แทนที่จะเป็น wget-google.com ตั้งชื่อไฟล์ wget-google-com การต่อท้าย .sh ยังเป็นตัวเลือกดังนั้น update.es.cluster เปลี่ยนชื่อเป็น update.es.cluster.sh
ธง -modulino เป็นตัวเลือกสำหรับ Funk ช่วยให้สามารถแยกหน้าที่สคริปต์อย่างเข้มงวดลงในสคริปต์แอปพลิเคชันที่แตกต่างกับสคริปต์ห้องสมุด โดยทั่วไปสคริปต์แอปพลิเคชันจะถูกดำเนินการโดยการเรียกใช้เส้นทางเช่น ./hello หรือ ~/bin/hello หรือเพียงแค่ hello เมื่อมีการแก้ไข $PATH อย่างเหมาะสม แอปพลิเคชันสคริปต์คุณลักษณะการอนุญาตให้ใช้งานได้และอาจเป็นกลุ่มและอื่น ๆ ขึ้นอยู่กับความต้องการการกำหนดค่าระบบ ในทางตรงกันข้ามสคริปต์ห้องสมุดมีวัตถุประสงค์เพื่อนำเข้าด้วย dot ( . ) หรือ source ลงในเชลล์ผู้ใช้หรือสคริปต์อื่น ๆ และควรมีส่วนขยายไฟล์เช่น .lib.sh , .sh , .bash ฯลฯ โดยใช้การตั้งชื่อแยกต่างหาก โดยเฉพาะอย่างยิ่งโดยการวางนามสกุลไฟล์สำหรับแอปพลิเคชันเชลล์สคริปต์เราขอแนะนำให้ผู้เขียนเลือกชื่อสคริปต์ที่มีความหมายมากขึ้น แทนที่จะเป็น build.sh ทั่วไปเลือก build-docker แทนที่จะเป็น kafka.sh ให้เลือก start-kafka , kafka-entrypoint ฯลฯ
ในที่สุด stink พิมพ์บันทึกของ posixyness ของแต่ละไฟล์รวมถึงฟิลด์ที่น่าสนใจใด ๆ ที่ระบุไว้ระหว่างทาง โปรดทราบว่าบางฟิลด์อาจมีค่าเป็นศูนย์หากกลิ่นเหม็นของ posix หรือการไหลของสีกุหลาบของ nonposix เป็นการวิเคราะห์ที่ล้นหลามและลัดวงจร คุณลักษณะการไหลเวียนของการไหลเวียนนี้เร่งความเร็วอย่างมากในการค้นหาโครงการขนาดใหญ่ที่ stank
โปรดทราบว่าการอนุญาตจะถูกถ่ายทอดเป็นทศนิยมเนื่องจากข้อ จำกัด ในการจัดรูปแบบ Integer JSON (เราไม่ต้องการใช้ฟิลด์สตริงคู่ที่กำหนดเอง) ใช้ echo 'obase=8;<some integer> | bc เพื่อแสดงค่าเหล่านี้ใน octal
โปรดทราบว่าระบบมรดกแพ็คเกจและสคริปต์เชลล์ที่อ้างอิง "SH" อาจอ้างถึงเปลือกหอยไว้ล่วงหน้ามากมาย ระบบที่ทันสมัยเปลี่ยนชื่อ "sh" เป็น "lksh", "tsh", "etsh" ฯลฯ เพื่อหลีกเลี่ยงความสับสน โดยทั่วไปชุด Stank จะสมมติว่าสคริปต์ส่วนใหญ่ที่สแกนกำลังตั้งเป้าหมายเทคโนโลยีหลังปี 1971 ดังนั้นใช้สัญชาตญาณและบริบทของมนุษย์เพื่อจดบันทึกมรดก Thompson Unix V6 "SH" ฯลฯ สคริปต์ ผ้าลินินที่ทันสมัยส่วนใหญ่จะไม่สามารถแยกวิเคราะห์สคริปต์ดังกล่าวของความซับซ้อนใด ๆ และพวกเขาจะไม่รู้จักพวกเขาสำหรับสคริปต์มรดกที่พวกเขาเป็นเว้นแต่ว่าสคริปต์ของ shebangs จะแสดงผลด้วยล่ามย้อนยุคที่ทันสมัย "lksh", "tsh", "etsh" ฯลฯ เราเกือบจะใช้สถิติ FS สำหรับการดัดแปลง/เปลี่ยนแปลงเพื่อพยายามระบุค่าผิดปกติมรดกเหล่านี้ แต่นี่เป็นข้อสันนิษฐานที่ไม่สมจริงในทางปฏิบัติยกเว้นนักโบราณคดีที่ครอบงำที่สุด ดังนั้นระบบ Stank จะถ่อและสมมติว่า sh -> posix sh, ksh -> ksh88 / ksh93 เพื่อประโยชน์ของความทันสมัยและความสมดุล
ในทำนองเดียวกัน Bourne Shell AKA "SH" AKA "BSH" เก่านำเสนอปัญหาการระบุภาษา สคริปต์ Shell Bourne Old มักจะนำเสนอตัวเองด้วย "sh" shebangs ซึ่งก็โอเคเพราะ Bourne SH และ KSH88/PDKSH/KSH ทำหน้าที่เป็นฐานสำหรับมาตรฐาน POSIX SH บางระบบที่ทันสมัยอาจนำเสนอเปลือกบอร์นเป็นไบนารี "SH" หรือ "BSH" อดีตนำเสนอปัญหาเล็กน้อยสำหรับการระบุตัวตนของ Stank แม้ว่า "BSH" นั้นเป็นเรื่องยุ่งยากเนื่องจากการใช้งานส่วนใหญ่ในวันนี้ไม่เกี่ยวข้องกับ Bourne Shell แต่กับ Java Beanshell ดังนั้น Stank อาจเริ่มต้นในการรักษาสคริปต์ bsh เป็นที่ไม่ใช่ Posixy และสคริปต์เชลล์ Bourne ใด ๆ ดังกล่าวได้รับการแนะนำให้นำเสนอทั้ง bash หรือ SHEBANGS และอาจเป็นส่วนขยาย .sh sh .bash
$ stink examples/hello
{"Path":"examples/hello","Filename":"hello","Basename":"hello","Extension":"","Shebang":"#!/bin/sh","Interpreter":"sh","LineEnding":"n","FinalEOL":false,"ContainsCR":false
,"Permissions":509,"Directory":false,"OwnerExecutable":true,"BOM":false,"POSIXy":true,"AltShellScript":false}
$ stink -pp examples/hello
{
"Path": "examples/hello",
"Filename": "hello",
"Basename": "hello",
"Extension": "",
"Shebang": "#!/bin/sh",
"Interpreter": "sh",
"LineEnding": "n",
"FinalEOL": false,
"ContainsCR": false,
"Permissions": 509,
"Directory": false,
"OwnerExecutable": true,
"BOM": false,
"POSIXy": true,
"AltShellScript": false
}
$ stink -pp examples/hello.py
{
"Path": "examples/hello.py",
"Filename": "hello.py",
"Basename": "hello.py",
"Extension": ".py",
"Shebang": "#!/usr/bin/env python",
"Interpreter": "python",
"LineEnding": "n",
"FinalEOL": false,
"ContainsCR": false,
"Permissions": 420,
"Directory": false,
"OwnerExecutable": false,
"BOM": false,
"POSIXy": false,
"AltShellScript": false
}
$ stink -help
-cr
Report presence/absence of any CR/CRLF's
-eol
Report presence/absence of final end of line sequence
-help
Show usage information
-pp
Prettyprint smell records
-version
Show version information examples/ ไดเรกทอรีแสดงให้เห็นถึงกรณีที่ขอบหลายอย่างเช่นสคริปต์ที่ว่างเปล่าสคริปต์ Shebang-Less, สคริปต์ที่ขยายและไม่มีส่วนขยายและแอปพลิเคชัน Hello World ต่างๆในภาษาการเขียนโปรแกรมหลายภาษา ไฟล์บางไฟล์เช่น examples/goodbye อาจมีเนื้อหาสคริปต์ Posix Shell ที่ถูกต้อง 100% แต่ไม่สามารถระบุตัวเองด้วย Shebangs หรือส่วนขยายไฟล์ที่เกี่ยวข้อง ในโครงการขนาดใหญ่ไฟล์ดังกล่าวอาจได้รับการปฏิบัติอย่างผิดพลาดว่าเป็นรูปแบบ Whoknowswhat หรือเพียงแค่ข้อความธรรมดา บางทีวิธีการทางสถิติอาจช่วยระบุ Posix Grammars แต่แม้กระทั่งไฟล์ที่ว่างเปล่าก็เป็น Posix ทางเทคนิคซึ่งไม่ช่วยเหลือจากมุมมองการจำแนกที่เชื่อถือได้ ไม่ว่าในกรณีใด examples/ หวังว่าจะครอบคลุมกรณีขอบทั่วไปมากขึ้น
วิธีหนึ่งที่คิดว่า stank คือนักล่าเงินรางวัลสำหรับสคริปต์เชลล์
เนื่องจากเชลล์มีแนวโน้มที่จะเปราะบางกว่าภาษาการเขียนโปรแกรมระดับสูงกว่าดังนั้นจึงเป็นความคิดที่ดีที่จะเขียนรหัสเชลล์ใหม่เป็นแอปพลิเคชันเฉพาะ Go และ Rust เป็นตัวเลือกที่ดีสำหรับภาษาแอปพลิเคชัน
ภาษาการเขียนโปรแกรมสนิมมีประสิทธิภาพที่ดีที่สุดในชั้นเรียนความน่าเชื่อถือและความปลอดภัย ภาษาการเขียนโปรแกรม GO มีประสิทธิภาพความน่าเชื่อถือและความปลอดภัยที่เทียบเคียงได้ในบริบทส่วนใหญ่ ทั้ง Rust and Go รองรับการคอมไพล์ข้ามและการดำเนินการคงที่เพื่อให้ง่ายต่อการพัฒนาทดสอบแพ็คเกจและแจกจ่ายแอปพลิเคชันสนิม/ไปเมื่อเทียบกับสคริปต์เชลล์ที่ไม่สม่ำเสมอ เชลล์โค้ดส่วนใหญ่ละเลยที่จะพิจารณาปัญหาการล็อคผู้ขายที่ละเอียดอ่อนด้วยไวยากรณ์เชลล์และธงที่ใช้สำหรับแต่ละคำสั่ง Rust มีเส้นโค้งการเรียนรู้ที่ชันกว่าผู้เขียนโค้ดบางคนยินดีที่จะอุทิศเวลา บ่อยครั้งที่ไปสามารถทำหน้าที่ประนีประนอมได้ การรวบรวมภาษาทั้งสนิมและไปได้รับการปกป้องจากข้อผิดพลาดของรันไทม์หลายครั้งที่เชลล์และภาษาที่ตีความอื่น ๆ เชิญ
โดยไม่คำนึงถึงภาษาการเขียนโปรแกรมโดยเฉพาะนั้นมีความสำคัญน้อยกว่าความกังวลตราบใดที่ไม่ใช่เชลล์ ภาษาการเขียนโปรแกรมที่เป็นอันตรายอย่างมากเช่น JavaScript และ Perl ยังคงปลอดภัยกว่าเชลล์ เปลือกหอย (ทุกรสชาติ) เป็นไฟถังขยะที่รอประกายไฟ
โชคดีที่รายการสคริปต์เชลล์ที่ stank ออกมาสามารถช่วยวิศวกรในการระบุผู้สมัครโปรแกรมเพื่อเขียนใหม่ในภาษาการเขียนโปรแกรมที่เป็นผู้ใหญ่มากขึ้น
BSD-2-clause
(ไม่มี)
สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับการพัฒนา Stank เองดู Development.md
โปรดทราบว่าส่วนประกอบซอฟต์แวร์จำนวนมากมีนิสัยที่ไม่ดีในการส่งเสริมให้มีการฝังตัวของเชลล์สคริปต์แบบอินไลน์ลงในไฟล์สคริปต์ที่ไม่ใช่เปลือก ตัวอย่างเช่นการกำหนดค่างาน CI/CD, DockerFile Run Steps, Kubernetes Resources และ Make เครื่องมือ linter ส่วนใหญ่ (สำหรับสคริปต์เชลล์และภาษาอื่น ๆ ) มีการสนับสนุนที่ จำกัด หรือไม่มีอยู่มากสำหรับตัวอย่างสคริปต์เชลล์แบบผ้าสำลี
ดังนั้นย้ายตัวอย่างเชลล์สคริปต์ไปยังไฟล์เชลล์สคริปต์เฉพาะ จากนั้นให้ส่วนประกอบซอฟต์แวร์ดำเนินการเชลล์สคริปต์ จากนั้นคุณจะสามารถผ้าสำลีเชลล์ด้วยเครื่องมือเพิ่มเติมและเพิ่มระดับคุณภาพของระบบของคุณ
ไฟล์ที่ค่อนข้างคลุมเครือบางอย่างเช่นซอร์สโค้ด LISP ทั่วไปที่มี multiline, polyglot shebangs และไม่มีการขยายไฟล์อาจกระตุ้นไลบรารี Stank และแอปพลิเคชัน Stink และ Stank ซึ่งลัดวงจรในบรรทัดแรกของ Hacky Shebang ไฟล์ดังกล่าวอาจถูกระบุว่าเป็นรหัส "posix" ซึ่งเป็นพฤติกรรมที่ตั้งใจไว้! นี่เป็นเพราะ Polyglot Shebang เป็นแฮ็คในการแก้ไขข้อ จำกัด ในภาษา Lisp ทั่วไปซึ่งโดยปกติแล้วจะไม่ยอมรับความคิดเห็น Posix Shebang เพื่อที่จะได้สคริปต์ Lisp ทั่วไปให้เป็นจุดที่น่าเบื่อใน Bash สำหรับสถานการณ์นี้เป็นการดีที่สุดที่จะให้นามสกุลไฟล์ที่เหมาะสมกับไฟล์ดังกล่าว
$ head examples/i-should-have-an-extension
#!/usr/bin/env sh
#|
exec clisp -q -q $0 $0 ${1+"$@"}
|#
(defun hello-main (args)
(format t "Hello from main!~%"))
;;; With help from Francois-Rene Rideau
;;; http://tinyurl.com/cli-args
$ stink -pp examples/i-should-have-an-extension
{
"Path": "examples/i-should-have-an-extension",
"Filename": "i-should-have-an-extension",
"Basename": "i-should-have-an-extension",
"Extension": "",
"BOM": false,
"Shebang": "#!/usr/bin/env sh",
"Interpreter": "sh",
"LineEnding": "n",
"POSIXy": true
} บางทีผนวกส่วนขยาย .lisp กับไฟล์ดังกล่าว หรือแยกโมดูลูลิโนออกเป็นโมดูลไลบรารีที่ชัดเจนและโมดูลบรรทัดคำสั่ง หรือแยกการโต้ตอบของเชลล์ลงในสคริปต์เฉพาะ หรือโน้มน้าวให้ผู้ดูแลภาษาปฏิบัติต่อ Shebangs เป็นความคิดเห็น เขียนสมาชิกสภาคองเกรสของคุณ อย่างไรก็ตามคุณแก้ไขปัญหานี้รู้ว่าสถานการณ์ในปัจจุบันอยู่นอกบรรทัดฐานและมีแนวโน้มที่จะทำลายในรูปแบบที่เหมาะสมและน่าทึ่ง ด้วย Wyverns และ Flaming Seas และ Portents ทุกรูปแบบ
bois ที่ไม่ดีเหล่านี้ช่วยในการเพิ่มสคริปต์เชลล์ของคุณ แม้ว่าพวกเขาจะได้รับการออกแบบมาเพื่อทำงานกับไฟล์แต่ละไฟล์ดังนั้นอย่าลืมทำโครงการขนาดใหญ่ขึ้นและส่งผลลัพธ์ไปยัง xargs [-0] [-n ... shellcheck
ข้อเสนอ ACK --shell [-f] ธงที่ทำหน้าที่คล้ายกับ stank กับข้อแม้ที่ ACK รวมถึงเปลือกหอย nonposix เช่น CSH, TCSH และ FISH ในผลลัพธ์เหล่านี้ แต่ในขณะที่การเขียนนี้ไม่สามารถรวม Posix Shells เช่น Ash, Dash, Posh, PDKSH, KSH93 และ MKSH ACK ยังขึ้นอยู่กับ Perl ทำให้มันมีน้ำหนักมากขึ้นสำหรับ Microservices Docker และแพลตฟอร์มที่มีข้อ จำกัด อื่น ๆ
Kirill ระบุเอกสาร JSON
นักภาษาศาสตร์ซึ่งเป็นความพยายามพิเศษของ GitHub ในการระบุภาษาใดที่มีการเขียนในภาษาใดที่มีการเขียนในขณะที่โครงการ Go ที่ Stanky ไม่ได้ใช้นักภาษาศาสตร์ในการวิเคราะห์อัตโนมัติมันคุ้มค่าที่จะกล่าวถึงวัตถุประสงค์ทางนิติวิทยาศาสตร์
Linters, wiki ของ linters ภาษาการเขียนโปรแกรมทั่วไปและเครื่องมือ SAST
Periscope เตือนเกี่ยวกับแพ็คเกจ NPM ที่ยังไม่ได้ถ่าย
SAIL ระบุไฟล์ซอร์สโค้ด C/C ++
Slick เสนอการตรวจสอบไวยากรณ์ sh -n กับไวยากรณ์ POSIX บริสุทธิ์ในขณะที่ sh จริงในระบบส่วนใหญ่ symlinks ที่จะทุบตี
UNMAKE, linter สำหรับ makefiles