วัน: 28 กรกฎาคม 2026

รัน Python Script บน Terminal โดยไม่ต้องสร้างไฟล์ (Fileless Execution)รัน Python Script บน Terminal โดยไม่ต้องสร้างไฟล์ (Fileless Execution)

ในการดูแลระบบหรือเขียน Script อัตโนมัติบน Linux/macOS บ่อยครั้งที่เราต้องการรันโค้ด Python เพียงครั้งเดียว (One-off task) เช่น การ query ฐานข้อมูล, การเรียกยิง Webhook/API หรือการแปลง JSON ชั่วคราว แต่การสร้างไฟล์ .py ทิ้งไว้มักทำให้ workspace รก หรืออาจเผลอทิ้ง sensitive data (API Key, รหัสผ่าน) ไว้บนดิสก์

Shell มีกลไกการป้อนโค้ดเข้าสู่ Python Runtime บนหน่วยความจำ (RAM) ได้โดยตรง โดยแบ่งรูปแบบการใช้งานออกเป็น 3 ส่วนหลัก


1. แบบบรรทัดเดียว (Inline One-liner via -c)

เหมาะสำหรับงานสั้น ๆ ตรวจสอบแพ็กเกจ หรือคำนวณค่าง่าย ๆ

python3 -c "import sys; print('Python version:', sys.version)"
  • ข้อดี: สั้น รวดเร็ว เรียกต่อใน shell script อื่นได้ง่าย
  • ข้อจำกัด: ไม่เหมาะกับโค้ดที่มีการเว้นวรรค (indentation) ซับซ้อน หรือมี quote ซ้อนกันหลายชั้น

2. แบบบล็อกโค้ดยาวผ่าน Standard Input (stdin)

เป็นท่าที่ Clean และแนะนำมากที่สุดสำหรับการรันโค้ดยาวหลายบรรทัด โดยส่งเนื้อหาผ่าน Heredoc (<< 'EOF') เข้าสู่ stdin ของ Python (แทนด้วยเครื่องหมาย -)

python3 - << 'EOF'
import os
import sys

print(f"Current PID: {os.getpid()}")
print("Platform:", sys.platform)
for i in range(3):
    print(f"Counting: {i}")
EOF
  • จุดสำคัญ: ให้ครอบ EOF ด้วย single quote เสมอ ('EOF') เพื่อบอกให้ Shell ปิดตัวแปรแบบ parameter expansion ป้องกันไม่ให้ Shell แปลงตัวแปร $var ในโค้ดก่อนที่จะส่งไปถึง Python
  • ประสิทธิภาพ: ไม่มีการ fork subshell ซ้อน ประมวลผลสตรีมข้อความตรงเข้า process ของ Python ทันที

3. แบบ Command Substitution ร่วมกับ -c

ท่านี้เป็นการใช้คำสั่ง cat รวมบล็อก Heredoc ให้เป็น string ก้อนเดียวผ่าน $(...) แล้วโยนเข้าเป็น argument ของแฟล็ก -c

python3 -c "$(cat << 'EOF'
import json

data = {"status": "success", "code": 200}
print(json.dumps(data, indent=2))
EOF
)"
  • เมื่อไหร่ที่ใช้: เหมาะกับกรณีที่ต้องการส่ง argument ให้ Python script ผ่าน command-line interface ต่อท้าย หรือมี tooling ภายนอกที่บังคับรับคำสั่งผ่าน parameter string เท่านั้น

การส่ง Arguments เพิ่มเติมเข้า Script

หากจำเป็นต้องส่งพารามิเตอร์จาก Shell เข้าสู่ sys.argv ของ Python สามารถระบุต่อท้าย delimiter ได้ทันที

python3 - "arg1" "arg2" << 'EOF'
import sys

print("Script Name / Stdin:", sys.argv[0])
print("Arguments:", sys.argv[1:])
EOF


เปรียบเทียบทั้ง 3 รูปแบบ

รูปแบบไวยากรณ์เหมาะกับงานความซับซ้อนของ Shell
One-linerpython3 -c "..."ตรวจสอบไวๆ, สคริปต์สั้น 1 บรรทัดต่ำมาก
Heredoc + stdinpython3 - << 'EOF'โค้ดยาว, logic ซับซ้อน, Production tasksต่ำ (Stream เข้า Process ตรง)
Heredoc + $() + -cpython3 -c "$(cat << 'EOF')"ป้อนผ่าน wrapper หรือ script templateปานกลาง (สร้าง Subshell เพิ่ม)