לינוקס מסוכן לבריאות

arye167

New member
לינוקס מסוכן לבריאות

ערכתי רשימה, ומטרתה להראות 3 דברים.
1) ששימוש בסיסי בshell, הוא *מאוד* מורכב, ויש מעל 40 ווריאציות לפקודה בסיסית של קריאה מקובץ, אבל כל אחד עושה דבר שונה לחלוטין, כך שכל שינוי הכי קטן, עושה הבדל של עולם ומלואו. ודרך אגב, רק 2 יעשות אותה פעולה, וזה שורה 8 ו-9. (למה?)
2) חלק גדול, כלל לא מוזכר ב-man page..חלקם אין להם רמז בכלל, ובכל זאת אלו פקודות שמאוד דומים לאלו שמוזכרים שם. כך ש-RTFM הוא כרגיל תשובה לא מספקת בלשון המעטה, כמו ברוב המקרים.
3) בהסתייגות, רשמתי באג על שורה 19, וזה מפתיע...אחרי הכל מדובר בshell שצבר וותק יותר מ-30 שנה..

דרך אגב, יש כמה שורות שהפקודות לא חוקיות, ונרשמו רק כדי להבהיר את מקרי הקצה...בדרך כלל הם מבהירים או ממחישים את השוני מהפקודות בשורות הקרובות אליהן, מלמעלה או למטה..

רשמתי אחרי כל שורה, את המספר, כדי שיהיה ברור יותר.


#!/bin/bash
> foo #1
< foo #2
>| foo #3
2> foo #4
2< foo #5
> 1 #6
2> 1 #7
2>& 1 #8
2<& 1 #9
> 1- #10
> - #11
>& 1- #12
<& 1- #13
<& foo #14, illegal!
>& foo #15
<& foo- #16, illegal!
<& -- #17, illegal! (redirection is ok. but 2nd `-' evaluates to a new token..not part of the direction)
(foo=-; <& $foo) #18, ok! (similar to #13)
(foo=-; <& $foo-) #19, ok!, but compare to #17, i.e. `<& --'. Is it a bug?
>& foo- #20, illegal!
&> 1 #21
&> 1- #22
&> foo #23
&> foo- #24, ok!2
>> foo #25
&>> foo #26
<< foo #27
foo
<<- foo #28
foo
<< \foo #29
foo
{foo}> foo #30
{foo}< foo #31
{foo}<>foo #32
{foo}<<<foo #33
: | : #35, `:' is the so-called nope command
: |& : #36, `:' is the so-called nope command
 
1,3 זהים בתלות בערך של noclobber

הם שונים רק עבור set -C

15,23 גם זהים להבנתי (ואריאציה של 8), והייתי מוסיף עוד פקודה לא חוקית, המשלימה ל26:

>>& foo


לגבי 27, הייתי מוסיף את נושא המרכאות:
ראה הבדל בין

A=1
cat<<foo
$A
foo

לבין

A=1
cat<<"foo"
$A
foo


לגבי 35,36 - לרגע חשבתי שהתחלת לכתוב

:(){ :|:& };:



לגבי הבאג (17,19) - ראה גם:

foo=-
<& "$foo-"
<& \--
<& \-


להערכתי זה לא באג אלא צורה שמורה.
foo$ מוערך כמספר, והמספר הוא 0.

<& 0-
 
שכחתי את הסיפא של הבאג

השווה בין:

foo=0
<& $foo-


לבין (עשה כל אחד מהם בטרמינל נפרד)

foo=1
<& $foo-

וראה מה קורא אחרי כל הקלדה, למשל נסיון להקצות לfoo ערך חדש


לבין

foo=2
<& $foo-
 

BravoMan

Active member
לא הבנתי את הרשימה הזו:

מה אתה בעצם מנסה להגיד?

בשורה #1 למשל יש redirect של פלט (של כלום, אבל אני מניח שהתכוונת לפקודה כלשהי) לתוך קובץ בשם foo, אבל בשורה #2 יש את הפעולה ההפוכה: הפנייה של תוכן של foo לקלט.

אז מה הקשר של שורה #1 לקריאת קבצים?
ואיך שורה #1 ו-#2 זו "אותה פקודה"?

ואם כבר, מה הקשר של הזרמה דרך pipe של nop (זה בלי E אגב) ל-nop (קיצור של No OPeration) אחר לכתיבה או קריאה של קבצים?

(כן, אני יודע שבלינוקס pipe הוא למעשה קובץ כמו רוב הדברים, אבל אני מניח שלא לזה היית כוונת המשורר).

אישית, אני מתייחס ל-Shell כשפת תכנות לכל דבר (אף שחסרים לה כמה מאפיינים של שפת תכנות מלאה), וכמו בכל שפת תכנות יש יותר מדרך אחת לבצע פעולה מסוימת, כאשר המגבלה העיקרית היא הדמיון והמיומנות של המתכנת שמשתמש בה...

ועד היום לא הבנתי למה מבחר רע לבריאות, אם כי נתקלתי בטענה הזו גם בהקשר לדברים אחרים, כמו למשל וויכוח Android נגד iOS.
 
למעלה