ห้ามเว้นวรรครอบ ๆ เครื่องหมาย = เมื่อใด


9

ฉันรู้ว่าใน ~ / .bashrc เราต้องไม่เว้นช่องว่างรอบ=เครื่องหมายในการมอบหมาย:

$ tail -n2 ~/.bashrc 
alias a="echo 'You hit a!'"
alias b = "echo 'You hit b!'"

$ a
You hit a!

$ b
b: command not found

ฉันกำลังตรวจสอบไฟล์ MySQL config /etc/my.cnfและฉันพบสิ่งนี้:

tmpdir=/mnt/ramdisk
key_buffer_size = 1024M
innodb_buffer_pool_size = 512M
query_cache_size=16M

ฉันจะตรวจสอบว่าช่องว่างรอบ=สัญญาณไม่ได้เป็นปัญหาได้อย่างไร

โปรดทราบว่าคำถามนี้ไม่ได้เฉพาะเจาะจงกับ/etc/my.cnfไฟล์ แต่ใช้กับไฟล์ * NIX config โดยทั่วไป ความโน้มเอียงแรกของฉันคือ RTFM แต่อันที่จริงman mysqlไม่ได้กล่าวถึงปัญหาและถ้าฉันต้องไปล่าสัตว์ออนไลน์สำหรับแต่ละกรณีฉันจะไม่ไปไหนเลย มีการประชุมหรือวิธีตรวจสอบที่ง่ายหรือไม่? อย่างที่เห็นหลายคนแก้ไขไฟล์นี้ (แบบแผนต่าง ๆ สำหรับ=สัญญาณต่างๆ ) และฉันไม่สามารถบังคับให้พวกเขาทั้งหมดใช้ที่ว่างหรือไม่ฉันไม่สามารถตรวจสอบทุกสิ่งที่อาจได้รับการกำหนดค่าและอาจถูกต้องหรือไม่ถูกต้อง

แก้ไข:ความตั้งใจของฉันคือเพื่อให้แน่ใจว่าไฟล์ที่กำหนดค่าในปัจจุบันจะทำอย่างถูกต้อง เมื่อกำหนดค่าไฟล์เองฉันจะไปตามแบบแผนของสิ่งที่ผู้ดูแลแพ็คเกจใส่ไว้


2
ไม่มีสิ่งเช่น "* NIX config files โดยทั่วไป" หากฉันต้องการอนุญาตให้มีช่องว่างในไฟล์กำหนดค่าของฉันฉันจะเขียนโปรแกรมของฉันเพื่ออนุญาต หากฉันต้องการให้ไฟล์ปรับแต่งของฉันใช้โคลอนหรือไพพ์แทนเครื่องหมายเท่ากับกันฉันจะเขียนโปรแกรมเพื่อใช้งาน Bash ไม่ต้องมีช่องว่าง Mysql อนุญาตให้พวกเขา
Hymie

คำตอบ:


3

ฉันจะตอบว่าในทางที่ทั่วไปมากขึ้น- มองที่ทั้ง " ประสบการณ์การเรียนรู้ Unix "

ในตัวอย่างของคุณคุณใช้สองเครื่องมือและดูว่าภาษามีความคล้ายคลึงกัน มันไม่ชัดเจนว่าจะใช้อะไรเมื่อไหร่ แน่นอนคุณสามารถคาดหวังว่ามีโครงสร้างที่ชัดเจนดังนั้นคุณขอให้เราอธิบาย
เคสที่มีพื้นที่โดยรอบ=เป็นเพียงตัวอย่างเท่านั้น - มีเคสที่คล้ายกัน แต่ค่อนข้างมาก
มีที่จะมีตรรกะในนั้นที่เหมาะสม ?!

กฎวิธีการเขียนโค้ดสำหรับบางเครื่องมือเปลือกฐานข้อมูล ฯลฯเพียง แต่ขึ้นอยู่กับสิ่งที่เครื่องมือนี้โดยเฉพาะอย่างยิ่งต้อง

นั่นหมายความว่าเครื่องมือนั้นมีความเป็นอิสระอย่างสมบูรณ์ในทางเทคนิค ความสัมพันธ์เชิงตรรกะที่ฉันคิดว่าคุณคาดหวังเพียงแค่ไม่ได้อยู่

ความคล้ายคลึงกันอย่างชัดเจนของภาษาที่คุณเห็นไม่ได้เป็นส่วนหนึ่งของการใช้งานโปรแกรม ความคล้ายคลึงกันมีอยู่เนื่องจากนักพัฒนาได้ตกลงที่จะทำเมื่อพวกเขาเขียนมันลงสำหรับโปรแกรมเฉพาะ แต่มนุษย์สามารถตกลงเพียงบางส่วน

ความสัมพันธ์ที่คุณเห็นเป็นวัฒนธรรมสิ่ง - มันไม่เป็นส่วนหนึ่งของการดำเนินงานหรือในความหมายของภาษา



ดังนั้นตอนนี้เราได้จัดการทฤษฎีแล้วสิ่งที่ต้องทำในทางปฏิบัติ?

ขั้นตอนใหญ่คือการยอมรับว่าความมั่นคงที่คุณคาดหวังไม่มีอยู่ - ซึ่งง่ายกว่ามากเมื่อเข้าใจเหตุผล - ฉันหวังว่าส่วนของทฤษฎีจะช่วยในเรื่องนี้

หากคุณมีเครื่องมือสองอย่างที่ไม่ได้ใช้ภาษาการกำหนดค่าเดียวกัน (เช่นทั้งการใช้สคริปต์ทุบตี) การรู้รายละเอียดของไวยากรณ์ของเครื่องมือหนึ่งนั้นไม่ได้ช่วยอะไรมากนักในการทำความเข้าใจกับอีกเครื่องมือหนึ่ง
ดังนั้นแน่นอนคุณจะต้องขึ้นไปดูรายละเอียดได้อย่างอิสระ ตรวจสอบให้แน่ใจว่าคุณรู้ว่าคุณจะหาเอกสารอ้างอิงได้จากที่ไหน

ในด้านบวกมีความสอดคล้องบางอย่างที่คุณไม่คาดหวัง: ในบริบทของเครื่องมือเดียว (หรือเครื่องมือต่าง ๆ ที่ใช้ภาษาเดียวกัน) คุณสามารถมั่นใจได้ว่าไวยากรณ์สอดคล้องกัน
ในmysqlตัวอย่างของคุณหมายความว่าคุณสามารถสมมติได้ว่าทุกบรรทัดมีกฎเดียวกัน ดังนั้นกฎเป็น "พื้นที่ก่อนและหลัง=เป็นไม่เกี่ยวข้อง "

มีกว้างมีความแตกต่างในวิธีการที่ยากก็คือการเรียนรู้หรือใช้ภาษา Configuration- หรือสคริปต์ของเครื่องมือ
อาจเป็นเช่น "แสดงรายการค่า fooใน cmd-foo.conf หนึ่งค่าต่อบรรทัด"
มันอาจเป็นภาษาสคริปต์เต็มรูปแบบที่ใช้ในที่อื่นด้วย จากนั้นคุณมีเครื่องมือที่มีประสิทธิภาพในการเขียนการกำหนดค่า - และในบางกรณีนั่นเป็นสิ่งที่ดีมากในบางกรณีคุณจะต้องใช้มัน
เครื่องมือที่ซับซ้อนหรือ famillies ขนาดใหญ่ของเครื่องมือที่เกี่ยวข้องในบางครั้งก็ใช้ไวยากรณ์ไฟล์การกำหนดค่าพิเศษที่ซับซ้อนมาก- ( ตัวอย่างที่มีชื่อเสียงบางตัวคือsendmailและvim)
คนอื่นใช้การเขียนสคริปต์ทั่วไปภาษาเป็นฐานและขยายภาษานั้นเพื่อรองรับความต้องการพิเศษบางครั้งด้วยวิธีที่ซับซ้อนตามที่ภาษาอนุญาต ที่จะเป็นที่เฉพาะเจาะจงมากกรณีของโดเมนภาษาเฉพาะ ( DSL )


ยอมรับเนื่องจากนี่เป็นคำตอบที่ตอบโจทย์ส่วนใหญ่จากมุมมองของคำถาม ขอบคุณ!
dotancohen

20

Bash จะตีความบรรทัดที่มีข้อความตามด้วย=การกำหนดให้กับตัวแปร แต่มันจะตีความบรรทัดที่มีข้อความตามด้วยช่องว่างเป็นคำสั่งที่มีอาร์กิวเมนต์

var=assignment VS command =argument

สคริปต์ทุบตีทำงานบนหลักการที่ว่าทุกอย่างในสคริปต์นั้นเหมือนกับว่าคุณพิมพ์ลงในบรรทัดคำสั่ง

ในไฟล์การกำหนดค่าที่ไม่ได้ถูกตีความโดยbash(หรือเชลล์อื่น) มันจะถูกกำหนดโดยตัวแยกวิเคราะห์ที่ใช้ในการอ่านไฟล์การกำหนดค่า ตัวแยกวิเคราะห์บางตัวจะใช้ช่องว่างบางตัวจะไม่ มันขึ้นอยู่กับแอพพลิเคชั่นในกรณีนั้น ส่วนตัวผมไปกับทุกสิ่งที่ไฟล์การตั้งค่าเริ่มต้นใช้


ขอบคุณ ฉันกังวลเกี่ยวกับวิธีการตรวจสอบไฟล์ที่มีอยู่ในปัจจุบันและในอนาคตซึ่งอาจมีการกำหนดค่าโดย devops ประเภทอื่น เมื่อกำหนดค่าไฟล์เองฉันจะไปตามแบบแผนของสิ่งที่ผู้ดูแลแพคเกจใส่ไว้ที่นั่นตามที่คุณแนะนำ ฉันได้แก้ไขคำถามเพื่อชี้แจง
dotancohen

1
ฉันเดาว่าถ้าคุณตรวจสอบไฟล์ที่มีอยู่ฉันจะตรวจสอบเอกสารของผลิตภัณฑ์และใช้เป็นตัวอย่าง สมมติว่าคุณมีเอกสารและไม่ใช่แอปพลิเคชันที่สร้างขึ้นเอง หากเป็นแอปพลิเคชันที่กำหนดเองฉันจะยึดติดกับสิ่งที่มีอยู่ "ถ้ามันไม่พังอย่าแก้ไขเลย"
ลอเรนซ์

น่าเสียดายที่บางคนก็พัง นั่นเป็นเหตุผลที่ฉันถาม!
dotancohen

ในหอยไม่เคยใช้ช่องว่างรอบเท่ากับ ในทุกสิ่งที่ไม่ใช่เปลือกหอยให้ใช้ช่องว่างเสมอ คุณสามารถตรวจสอบไฟล์ที่มีอยู่โดยใช้ grep: 'grep "[^] = [^]" / etc / *' เพื่อค้นหาไฟล์ที่มี = ซึ่งไม่มีช่องว่าง
qris

2
@dotancohen (1. ) สำหรับไฟล์ปรับแต่งใด ๆ ควรมีอย่างน้อยหนึ่งการตั้งค่าที่จะค่อนข้างง่ายต่อการตรวจสอบว่ามันเสีย ไม่ว่าไฟล์กำหนดค่าจะอนุญาตให้มีช่องว่างหรือไม่ก็ตามก็ควรทำอย่างสม่ำเสมอตลอด (2. ) คุณสามารถดาวน์โหลดแอปพลิเคชันได้ตลอดเวลาและตรวจสอบการกำหนดค่าเริ่มต้นที่มาพร้อมกับ (3. ) คุณสามารถเว้นช่องว่างได้ตลอดเวลา a = bอาจไม่ได้รับการยอมรับ แต่a=bควรทำงานเสมอ
นักเล่นแร่แปรธาตุสองบิต

4

.bashrc ไม่มีอะไรมากไปกว่าไฟล์ปรับแต่งสำหรับ bash เช่น my.cnf, php.ini, httpd.conf หรือ launchd plist แต่ละคนมีไวยากรณ์ของตัวเองตั้งแต่การมอบหมายพื้นที่โดยไม่ใช้ช่องว่างของ bash ไปยังซุปแท็ก XML ของ launchd (นอกจากนี้ยังมีรุ่นไบนารี: -O)

ไม่มีการประชุมที่มั่นคงและคุณได้ค้นพบคำสั่งหลักของ Unix แล้ว: อ่านคู่มือละเอียด


1
.bashrcคือไม่ได้ไฟล์การกำหนดค่าสำหรับการทุบตี .bashrcเป็นเชลล์สคริปต์ที่ bash รันทุกครั้งที่กระบวนการ bash เริ่มต้นขึ้น สามารถใช้เพื่อกำหนดค่า bash แต่สามารถใช้เพื่อทำสิ่งอื่น ๆ ได้ทุกประเภทเช่นกัน: เป็นสคริปต์ไม่ใช่ไฟล์ปรับแต่ง
Josh

3

บางโปรแกรมมีการตรวจสอบไฟล์กำหนดค่าตัวอย่างเช่น

postfix check

มิฉะนั้นคุณจะได้รับไฟล์ปรับแต่งดั้งเดิมจากที่เก็บและเปรียบเทียบกับต่างกับปัจจุบัน


ที่จริงแล้วดูเหมือนว่าจะจัดการกับปัญหาหลัก ๆ ขอบคุณ!
dotancohen

2

ช่องว่างรอบสัญญาณเป็นปัญหาเสมอเมื่อคุณทำงานใน= bashไม่มีข้อยกเว้นอยู่ที่นี่คุณต้องเอาพื้นที่รอบ ๆ=ถ้าคุณต้องการที่จะได้รับมอบหมายงานที่ถูกต้องง่าย bash(ไม่มีการขยายตัวไม่เลขคณิตไม่มีกำหนดอาร์เรย์)

สำหรับไฟล์กำหนดค่าเนื่องจากแต่ละซอฟต์แวร์มีตัวแยกวิเคราะห์ของตัวเองเพื่อแยกวิเคราะห์ไฟล์กำหนดค่าbashไม่มีความสัมพันธ์กัน คุณต้องอ่านเอกสารเพื่อทราบว่าอนุญาตให้ใช้ไวยากรณ์ใดในไฟล์ปรับแต่ง

ตัวอย่างคือmysqlในสคริปต์เริ่ม/etc/init.d/mysqldต้นมันมีตัวแยกวิเคราะห์สำหรับmy.cnf:

# Try to find basedir in /etc/my.cnf
  conf=/etc/my.cnf
  print_defaults=
  if test -r $conf
  then
    subpat='^[^=]*basedir[^=]*=\(.*\)$'
    dirs=`sed -e "/$subpat/!d" -e 's//\1/' $conf`
    for d in $dirs
    do
      d=`echo $d | sed -e 's/[  ]//g'`
      if test -x "$d/bin/my_print_defaults"
      then
        print_defaults="$d/bin/my_print_defaults"
        break
      fi
      if test -x "$d/bin/mysql_print_defaults"
      then
        print_defaults="$d/bin/mysql_print_defaults"
        break
      fi
    done
  fi

มีข้อยกเว้นในเรื่อง(( var = 12 ))หรือvar=( value )หรือ$((var = 12))หรือ${var[foo = 12]}
Stéphane Chazelas

@ StéphaneChazelas: ไม่เกี่ยวกับกรณีเหล่านี้ในคำถามนี้เพิ่มข้อมูล ขอบคุณ
cuonglm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.