ฉันเพิ่งสังเกตเห็นว่าในหนึ่งในเครื่องของฉัน (เรียกใช้ Debian Sid) เมื่อใดก็ตามที่ฉันพิมพ์ls
ชื่อไฟล์ใด ๆ ที่มีช่องว่างมีคำพูดเดียวรอบมัน
ฉันตรวจสอบชื่อแทนของฉันทันทีเพื่อค้นหาพวกเขาเหมือนเดิม
wyatt@debian630:~/testdir$ ls
'test 1.txt' test1.txt
wyatt@debian630:~/testdir$ alias
alias ls='ls --color=auto'
alias wget='wget --content-disposition'
wyatt@debian630:~/testdir$
การทดสอบอื่นด้วยไฟล์ที่มีเครื่องหมายคำพูดเดี่ยวในชื่อของพวกเขา (เช่นการตอบคำขอโดย jimmij):
wyatt@debian630:~/testdir$ ls
'test 1.txt' test1.txt 'thishasasinglequotehere'\''.txt'
wyatt@debian630:~/testdir$ touch "'test 1.txt'"
wyatt@debian630:~/testdir$ ls
''\''test 1.txt'\''' test1.txt
'test 1.txt' 'thishasasinglequotehere'\''.txt'
อัพเดตด้วยเอาต์พุต coreutils-8.26 ใหม่ (ซึ่งเป็นที่ยอมรับน้อยกว่าความสับสน แต่ยังคงเกิดการระคายเคืองตามค่าเริ่มต้น) ขอบคุณPádraig Brady สำหรับงานพิมพ์นี้:
$ ls
"'test 1.txt'" test1.txt
'test 1.txt' "thishasasinglequotehere'.txt"
$ ls -N
'test 1.txt' test1.txt
test 1.txt thishasasinglequotehere'.txt
ทำไมสิ่งนี้จึงเกิดขึ้น ฉันจะหยุดมันอย่างถูกต้องได้อย่างไร
เพื่อชี้แจงฉันเองตั้ง ls เอาท์พุทสีโดยอัตโนมัติ มันไม่เคยใส่เครื่องหมายคำพูดรอบ ๆ สิ่งต่าง ๆ มาก่อน
ฉันวิ่งbash
แล้ว coreutils 8.25
แก้ไข: ปรากฏว่านักพัฒนา coreutils คิดว่า(ลิงก์)มันจะเป็นความคิดที่ดีที่จะทำให้มันเป็นค่าเริ่มต้นของโลกแม้ว่าจะทำลายหลักการของความประหลาดใจอย่างน้อยที่สุดรวมถึงประเพณี UNIX 46 ปีขึ้นไป
วิธีใดในการแก้ไขโดยไม่ต้องคอมไพล์ใหม่?
อัปเดต - ตุลาคม 2017 - Debian Sid ได้เปิดใช้งานการอ้างอิงเชลล์ใหม่อีกครั้งโดยค่าเริ่มต้น นี่เป็นเพียงการไร้สาระ https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=877582
และที่ด้านล่างของห่วงโซ่การตอบกลับไปยังรายงานข้อผิดพลาดก่อนหน้านี้ "การเปลี่ยนแปลงนั้นตั้งใจและจะยังคงอยู่" https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=813164#226
ฉันคิดว่านี่ถูกตัดสิน ชัดเจนว่าไม่.
ปรับปรุง: เมษายน 2019: เพิ่งพบรายงานข้อผิดพลาดที่ยิ่งใหญ่ใน PHP ที่เกิดจากการเปลี่ยนแปลงls
นี้ เมื่อคุณสร้างความสับสนให้กับนักพัฒนาและสร้างรายงานข้อผิดพลาดที่ผิดพลาดถึงเวลาแล้วที่จะต้องคิดถึงการเปลี่ยนแปลงของคุณอีกครั้ง
อัปเดต: กล่องของเล่น Android ls
กำลังทำสิ่งที่คล้ายกัน แต่มีแบ็กสแลชแทนที่จะเป็นเครื่องหมายคำพูด การใช้ตัวเลือก -q ทำให้ช่องว่างแสดงผลเป็น 'อักขระเครื่องหมายคำถาม' (ฉันไม่ได้ตรวจสอบสิ่งที่พวกเขาเป็นเพราะเห็นได้ชัดว่าไม่ได้มีช่องว่าง) ดังนั้นการแก้ไขเดียวที่ฉันพบจนถึงขณะนี้โดยไม่ต้องรูทอุปกรณ์ที่สงสัย นี่คือสคริปต์และแหล่งที่มามันเมื่อเปิดตัวเปลือก ฟังก์ชั่นนี้ls
ใช้คอลัมน์ถ้าอยู่ในเทอร์มินัลและพิมพ์หนึ่งรายการต่อบรรทัดในขณะที่หลอกให้ls
พิมพ์คำต่อคำในช่องว่างเพราะมันวิ่งผ่านไปป์
ls() {
# only way I can stop ls from escaping with backslashes
if [ -t 1 ]; then
/system/bin/ls -C "$@" |cat
else
/system/bin/ls "$@" |cat
fi
}
ls | cat
ดูว่ามันหายไปไหม หากฉันมีเครื่องย้อนเวลาฉันจะกลับไปที่ Bell Labs ~ 1970 และพยายามโน้มน้าวให้ Ken Thompson ให้พื้นที่ในชื่อไฟล์และไดเรกทอรีเป็นความคิดที่ไม่ดี :-P
'*'
ออกคิดว่าหนึ่งในสคริปต์ของฉันได้ไปเป๋และเปลี่ยนชื่อไฟล์ทั้งหมดของฉันไป ฉันเดาว่าฉันจะเพิ่มls
ชื่อแทนไปยังเครื่องจักรทั้งหมดของฉันเพื่อกำจัดมัน ...
QUOTING_STYLE=literal
แทนที่จะเป็นนามแฝง (ฉันเดาว่ามันเป็นเรื่องของรสนิยม แต่ฉันชอบตัวแปร)
ls
คำสั่ง