| shfmt(1) | General Commands Manual | shfmt(1) |
نام (NAME)
shfmt - قالببندی برنامههای شل
خلاصه دستور (SYNOPSIS)
shfmt [flags] [path...]
توضیحات (DESCRIPTION)
دستور shfmt برنامههای شل را قالببندی میکند. اگر تنها آرگومان یک خط تیره (-) باشد یا هیچ آرگومانی داده نشود، ورودی استاندارد استفاده خواهد شد. اگر مسیر دادهشده یک دایرکتوری باشد، تمام اسکریپتهای شلِ پیدا شده در آن دایرکتوری استفاده خواهند شد.
اگر هرگونه فایل EditorConfig یافت شود، از آنها برای اعمال گزینههای قالببندی استفاده خواهد شد. اگر هرگونه پرچم تجزیهکننده یا چاپگر به ابزار داده شود، هیچ گزینه قالببندی EditorConfig اعمال نخواهد شد. یک مقدار پیشفرض مانند -i=0 میتواند برای این منظور استفاده شود.
قالببندی پیشفرض شل در shfmt به گونهای انتخاب شده است که سازگار، معمول و قابل پیشبینی باشد. برخی از جنبههای قالببندی را میتوان از طریق پرچمهای چاپگر پیکربندی کرد.
گزینهها (OPTIONS)
پرچمهای عمومی (Generic flags)
--version
-l[=0], --list[=0]
-w, --write
-d, --diff
اگر خروجی یک ترمینال باشد، diff رنگی خواهد بود. برای عدم استفاده همیشگی از رنگ، متغیر غیرخالی NO_COLOR یا TERM=dumb را تنظیم کنید. برای استفاده همیشگی از رنگ، متغیر غیرخالی FORCE_COLOR را تنظیم کنید.
--apply-ignore
هنگام قالببندی مستقیم فایلها، بدون این پرچم از قواعد نادیدهگیری صرفنظر میشود. این پرچم برای هر ابزار یا ویرایشگری که stdin یا یک تکفایل را قالببندی میکند، مفید خواهد بود. هنگام چاپ نتایج در stdout، یک فایل نادیدهگرفتهشده منجر به هیچ خروجیای نمیشود.
--filename str
استفاده از این پرچم برای کارکرد پشتیبانی EditorConfig با stdin ضروری است، زیرا فایلهای EditorConfig نسبت به مکان یک اسکریپت پیدا میشوند.
پرچمهای تجزیهکننده (Parser flags)
-ln, --language-dialect <str>
هنگامی که روی auto تنظیم شود، تا زمانی که نام فایل ورودی دارای یک پسوند شل مانند foo.mksh باشد، زبان از روی آن تشخیص داده میشود. در غیر این صورت، اگر ورودی با یک shebang شل مانند #!/bin/sh آغاز شود، به جای آن استفاده میشود. اگر هیچکدام نتیجهای نداشته باشند، از bash به عنوان جایگزین پشتیبان (fallback) استفاده میشود.
پسوند نام فایل .sh یک حالت ویژه است: نشاندهنده posix است، اما ممکن است توسط یک shebang معتبر شل بازنویسی شود.
-p, --posix
-s, --simplify
پرچمهای چاپگر (Printer flags)
-i, --indent <uint>
-bn, --binary-next-line
-ci, --case-indent
-sr, --space-redirects
-kp, --keep-padding
این پرچم منسوخ شده است (DEPRECATED) و در نسخه اصلی بعدی حذف خواهد شد. برای اطلاعات بیشتر، ببینید: https://github.com/mvdan/sh/issues/658
-fn, --func-next-line
-mn, --minify
پرچمهای کاربردی (Utility flags)
-f[=0], --find[=0]
--to-json
--from-json
مثالها (EXAMPLES)
قالببندی تمام اسکریپتهای موجود در دایرکتوری جاری و چاپ مواردی که تغییر یافتهاند:
برای یکپارچهسازی مداوم (CI)، میتوان از حالتی استفاده کرد که تغییرات قالببندی صرفاً به صورت diff نشان داده شوند:
پرچمهای قالببندی زیر شباهت زیادی به سبک شل گوگل (Google) تعریفشده در https://google.github.io/styleguide/shellguide.html دارند:
در ادامه یک نمونه فایل EditorConfig تعریفشده بر اساس https://editorconfig.org آمده است که نحوه تنظیم گزینههای پشتیبانیشده را نشان میدهد:
[*.sh] # مانند -i=4 indent_style = space indent_size = 4 # --language-dialect shell_variant = posix simplify = true binary_next_line = true # --case-indent switch_case_indent = true space_redirects = true keep_padding = true # --func-next-line function_next_line = true minify = true # نادیدهگرفتن کل دایرکتوری "third_party" هنگام فراخوانی shfmt روی دایرکتوریها، # مانند "shfmt -l -w .". هنگام قالببندی مستقیم فایلها، # مانند "shfmt -w third_party/foo.sh" یا "shfmt --filename=third_party/foo.sh"، # منطق نادیدهگیری تنها در صورتی اعمال میشود که پرچم --apply-ignore داده شده باشد. [third_party/**] ignore = true
بخشهای EditorConfig همچنین میتوانند از `[[shell]]`، `[[bash]]`، یا `[[zsh]]` برای تطبیق با اسکریپتهای شل استفاده کنند، که بهویژه زمانی مفید است که اسکریپتها از shebang استفاده کرده اما پسوندی ندارند. توجه داشته باشید که این ویژگی خارج از مشخصات رسمی EditorConfig است و ممکن است در آینده تغییر کند.
دستور shfmt همچنین میتواند جایگزین bash -n برای بررسی خطاهای نحوی اسکریپتهای شل شود. این ابزار جامعتر است، زیرا تمام نحو را به صورت ایستا تجزیه کرده و به UTF-8 معتبر نیاز دارد:
$ echo '${foo:1 2}' | bash -n
$ echo '${foo:1 2}' | shfmt >/dev/null
1:9: not a valid arithmetic operator: 2
$ echo 'foo=(1 2)' | bash --posix -n
$ echo 'foo=(1 2)' | shfmt -p >/dev/null
1:5: arrays are a bash feature
نویسندگان (AUTHORS)
نگهداری توسط Daniel Martí <mvdan@mvdan.cc>، با همراهی سایر مشارکتکنندگان متنباز انجام میشود. برای اطلاعات بیشتر و توسعه، ببینید: https://github.com/mvdan/sh.
| 2026-04-07 |