บน Linux Shebang นั้นมีความยืดหยุ่นไม่มาก ตามคำตอบหลายคำตอบ (คำตอบของสตีเฟ่นคิตต์และของJörg W Mittag ) ไม่มีวิธีที่กำหนดไว้ในการส่งข้อโต้แย้งหลาย ๆ อย่างในแนว Shebang
ฉันไม่แน่ใจว่าจะเป็นประโยชน์กับทุกคนหรือไม่ แต่ฉันเขียนสคริปต์สั้น ๆ เพื่อใช้คุณสมบัติที่ขาดหายไป ดูhttps://gist.github.com/loxaxs/7cbe84aed1c38cf18f70d8427bed1efa
นอกจากนี้ยังสามารถเขียนวิธีแก้ไขแบบฝังได้ ซอลเบลโลว์ฉันขอนำเสนอวิธีแก้ปัญหาผู้ไม่เชื่อเรื่องภาษาสี่ประการที่นำไปใช้กับสคริปต์ทดสอบเดียวกันและผลการพิมพ์แต่ละครั้ง /tmp/shebang
ฉันคิดว่าสคริปต์เป็นปฏิบัติการและอยู่ใน
การตัดสคริปต์ของคุณใน bash heredoc ภายในการทดแทนกระบวนการ
เท่าที่ฉันรู้นี่เป็นวิธีที่ไม่เชื่อเรื่องภาษาที่เชื่อถือได้มากที่สุดในการทำ จะช่วยให้ผ่านข้อโต้แย้งและรักษา stdin ข้อเสียเปรียบคือล่ามไม่ทราบตำแหน่ง (จริง) ของไฟล์ที่อ่าน
#!/bin/bash
exec python3 -O <(cat << 'EOWRAPPER'
print("PYTHON_SCRIPT_BEGINNING")
from sys import argv
try:
print("input() 0 ::", input())
print("input() 1 ::", input())
except EOFError:
print("input() caused EOFError")
print("argv[0] ::", argv[0])
print("argv[1:] ::", argv[1:])
print("__debug__ ::", __debug__)
# The -O option changes __debug__ to False
print("PYTHON_SCRIPT_END")
EOWRAPPER
) "$@"
โทรecho -e 'aa\nbb' | /tmp/shebang 'arg1' 'arg2 contains spaces' 'arg3\ uses\ \\escapes\\'
พิมพ์:
PYTHON_SCRIPT_BEGINNING
input() 0 :: aa
input() 1 :: bb
argv[0] :: /dev/fd/62
argv[1:] :: ['arg1', 'arg2 contains spaces', 'arg3\\ uses\\ \\\\escapes\\\\']
__debug__ :: False
PYTHON_SCRIPT_END
โปรดทราบว่าการทดแทนกระบวนการผลิตไฟล์พิเศษ สิ่งนี้อาจไม่เหมาะกับไฟล์เรียกใช้งานทั้งหมด ตัวอย่างเช่น#!/usr/bin/less
บ่น:/dev/fd/63 is not a regular file (use -f to see it)
ฉันไม่ทราบว่าเป็นไปได้หรือไม่ที่จะมี heredoc อยู่ภายในการทดแทนกระบวนการอย่างรวดเร็ว
การตัดสคริปต์ของคุณใน heredoc ง่าย ๆ
สั้นลงและเรียบง่ายขึ้น แต่คุณจะไม่สามารถเข้าถึงได้stdin
จากสคริปต์ของคุณและมันต้องการล่ามเพื่อให้สามารถอ่านและรันสคริปต์stdin
ได้
#!/bin/sh
exec python3 - "$@" << 'EOWRAPPER'
print("PYTHON_SCRIPT_BEGINNING")
from sys import argv
try:
print("input() 0 ::", input())
print("input() 1 ::", input())
except EOFError:
print("input() caused EOFError")
print("argv[0] ::", argv[0])
print("argv[1:] ::", argv[1:])
print("__debug__ ::", __debug__)
# The -O option changes __debug__ to False
print("PYTHON_SCRIPT_END")
EOWRAPPER
โทรecho -e 'aa\nbb' | /tmp/shebang 'arg1' 'arg2 contains spaces' 'arg3\ uses\ \\escapes\\'
พิมพ์:
PYTHON_SCRIPT_BEGINNING
input() caused EOFError
argv[0] :: -
argv[1:] :: ['arg1', 'arg2 contains spaces', 'arg3\\ uses\\ \\\\escapes\\\\']
__debug__ :: True
PYTHON_SCRIPT_END
ใช้การsystem()
โทรawk แต่ไม่มีอาร์กิวเมนต์
ส่งผ่านชื่อไฟล์ที่ถูกเรียกใช้งานอย่างถูกต้อง แต่สคริปต์ของคุณจะไม่ได้รับอาร์กิวเมนต์ที่คุณให้ โปรดทราบว่า awk เป็นภาษาเดียวที่ฉันรู้ว่าทั้งสองมีล่ามติดตั้งบน linux โดยค่าเริ่มต้นและอ่านคำแนะนำจากบรรทัดคำสั่งโดยค่าเริ่มต้น
#!/usr/bin/gawk BEGIN {system("python3 -O " ARGV[1])}
print("PYTHON_SCRIPT_BEGINNING")
from sys import argv
print("input() 0 ::", input())
print("input() 1 ::", input())
print("argv[0] ::", argv[0])
print("argv[1:] ::", argv[1:])
print("__debug__ ::", __debug__)
# The -O option changes __debug__ to False
print("PYTHON_SCRIPT_END")
โทรecho -e 'aa\nbb' | /tmp/shebang 'arg1' 'arg2 contains spaces' 'arg3\ uses\ \\escapes\\'
พิมพ์:
PYTHON_SCRIPT_BEGINNING
input() 0 :: aa
input() 1 :: bb
argv[0] :: /tmp/shebang
argv[1:] :: []
__debug__ :: False
PYTHON_SCRIPT_END
ใช้การsystem()
โทรawk 4.1 ขึ้นไปโดยที่อาร์กิวเมนต์ของคุณไม่มีช่องว่าง
ดี แต่ถ้าคุณมั่นใจว่าสคริปต์ของคุณจะไม่ถูกเรียกด้วยอาร์กิวเมนต์ที่มีช่องว่าง อย่างที่คุณเห็นอาร์กิวเมนต์ของคุณที่มีช่องว่างจะถูกแยกเว้นแต่ช่องว่างจะถูกหลบหนี
#!/usr/bin/gawk @include "join"; BEGIN {system("python3 -O " join(ARGV, 1, ARGC, " "))}
print("PYTHON_SCRIPT_BEGINNING")
from sys import argv
print("input() 0 ::", input())
print("input() 1 ::", input())
print("argv[0] ::", argv[0])
print("argv[1:] ::", argv[1:])
print("__debug__ ::", __debug__)
# The -O option changes __debug__ to False
print("PYTHON_SCRIPT_END")
โทรecho -e 'aa\nbb' | /tmp/shebang 'arg1' 'arg2 contains spaces' 'arg3\ uses\ \\escapes\\'
พิมพ์:
PYTHON_SCRIPT_BEGINNING
input() 0 :: aa
input() 1 :: bb
argv[0] :: /tmp/shebang
argv[1:] :: ['arg1', 'arg2', 'contains', 'spaces', 'arg3 uses \\escapes\\']
__debug__ :: False
PYTHON_SCRIPT_END
สำหรับ awk รุ่นต่ำกว่า 4.1 คุณจะต้องใช้สตริงภายในสำหรับวงดูฟังก์ชั่นเช่นhttps://www.gnu.org/software/gawk/manual/html_node/Join-Function.html