2017-03-04からの
UPD :誰かが
英語の翻訳を完了しました。
ハッカーニュースに関する議論 。
記事の最初の部分では、多くのUNIX松葉杖と、一般的にさまざまな欠点をリストします。 2つ目は、「UNIXの哲学」に関するものです。 この記事は急いで書かれました。もう「磨く」ことはしたくありません。書いてくれてありがとう。 したがって、多くの事実を引用せずに引用します。
UNIXの松葉杖は、UNIXが登場した瞬間から出現し始めました。これは、Windowsだけでなく、Microsoft DOSの登場よりもさらに早い時期でした(チェックするのが面倒なので、自分でチェックしてください)。 読むのが面倒で、少なくともすべての点を調べてみると、何か面白いものが見つかるでしょう。 これは完全なリストではなく、これらは私が言及したかった浅瀬です。
- 当初、makeは1人が自分と数人の友人のために書いたプログラムでした。 その後、二度考えずに、Tabで始まる行を認識するコマンドを作成しました。 つまり、Tabはスペースとは異なって認識されていました。スペースは、UNIXをはじめとする非常にい異例の存在です。 彼は、makeがこの小さなグループ以外の誰かによって使用されるとは思わなかったため、これを行いました。 次に、makeは良いことであり、標準のUNIXパッケージに含めるとよいという考えが生まれました。 そして、すでに書かれたメークファイルを壊さないようにするために、つまり、ここにいる10人によって書かれた、彼は何も変えませんでした 。 まあ、それは私たちが生きている方法です...これらの10のため、私たちは皆苦しみます。
- ほぼ最初の頃、UNIXには/ usrフォルダーがありませんでした。 すべてのバイナリは/ binおよび/ sbinにありました。 しかし、その後、すべての情報は、UNIXの作者(Thompson、Ritchie)が自由に使えるディスクに収まるのをやめました。 したがって、彼らは別のディスクを取り出し、/ usrフォルダーを作成し、その中に別のビンと別のsbinを作成しました。 そして、新しいディスクを/ usrにマウントしました。 そこから行きました。 そのため、「2番目の階層」/ usrが現れ、ある時点で「3番目の階層」/ usr / local、そして/ optも現れました。 この物語のナレーターは次のように書いています。「いつか/ opt / localが表示されても驚かないでしょう。」 2017-02-12のUPD : このストーリーを描いたリンクを見つけました。 読んで、起こったことのより正確なバージョンがあります。
- あなたが思うかもしれないように、sbinはもともと「スーパーユーザーのビン」ではなく「静的なビン」を意味していました。 また、sbin静的バイナリが含まれていました。 しかし、その後、sbinには動的バイナリが含まれるようになり、その名前は意味を失いました。
- Windowsはレジストリの存在を非難されることが多く、同時に、UNIXライクなシステム(設定の束)のアプローチの方が優れていると報告されています。 ちなみに、ext4に一度機能が現れました(これがバグであるか、議論の余地があるかどうか)。そのため、コンピューターが突然シャットダウンすると、Gnomeはユーザーの作業フォルダー内のすべての構成を失いました。 そして、このext4の開発者は、バグレポートの議論で、Gnomeはレジストリのようなものを使用して情報を保存する必要があると述べました。
2017-02-12からのUPD :ソース: 1および2 。 メンテナーext4名の登録解除:Theodore Ts'o。 彼の言葉は次のとおりです。
何かがディスク上にあることを確認したい場合は、fsyncまたはfdatasyncを使用する必要があります。 fsync()のパフォーマンスオーバーヘッドについては、fdatasync()の方がはるかに軽量です。ファイルのサイズが頻繁に変更されないようにすることができれば。 バイナリデータベースを使用してこれを行うことができます。バイナリデータベースは、チャンクで成長し、めったに切り捨てられません。
GNOMEデスクトップ(これはgnomeパネルを意味しますが、私はあまり主要なデスクトップユーザーではありません)を使用し、「find。[A-zA-Z] * -mtime 0」には表示されないことに注意してください。多数のファイル。 私は、人々が報告している「数百のドットファイル」を作成している特定の不適切に書かれたアプリケーションがゼロの長さになっていると推測しています。そして、彼らがそれを頻繁に見ているのであれば、それはドットファイルが非常に頻繁に更新されているためでなければなりません。 悪いアプリケーションが何であるかはわかりませんが、大量の状態ファイルが消えることについて不満を言う人は、どのアプリケーションが関係しているかをチェックし、それらがどのくらいの頻度で変更されるかを把握する必要があります。 前述したように、多数のファイルが頻繁に変更されると、SSDにも悪影響が出ます。2.6.30で最も一般的なケースが修正されたとしても、不適切に作成されたアプリケーションを修正する理由はいくつかあります。 (一部のサーバーユーザーは、パフォーマンスを犠牲にするため、フラグを無効にしてマウントする場合があります。)
, UNIX ( /etc/passwd), (!) , , ⟦ls -l
⟧, . ⟦ls -l
⟧! . . . , .
Two famous people, one from MIT and another from Berkeley (but working on Unix) once met to discuss operating system issues. The person from MIT was knowledgeable about ITS (the MIT AI Lab operating system) and had been reading the Unix sources. He was interested in how Unix solved the PC loser-ing problem. The PC loser-ing problem occurs when a user program invokes a system routine to perform a lengthy operation that might have significant state, such as IO buffers. If an interrupt occurs during the operation, the state of the user program must be saved. Because the invocation of the system routine is usually a single instruction, the PC of the user program does not adequately capture the state of the process. The system routine must either back out or press forward. The right thing is to back out and restore the user program PC to the instruction that invoked the system routine so that resumption of the user program after the interrupt, for example, re-enters the system routine. It is called «PC loser-ing» because the PC is being coerced into «loser mode,» where «loser» is the affectionate name for «user» at MIT.
The MIT guy did not see any code that handled this case and asked the New Jersey guy how the problem was handled. The New Jersey guy said that the Unix folks were aware of the problem, but the solution was for the system routine to always finish, but sometimes an error code would be returned that signaled that the system routine had failed to complete its action. A correct user program, then, had to check the error code to determine whether to simply try the system routine again. The MIT guy did not like this solution because it was not the right thing.
— The Rise of «Worse is Better» By Richard Gabriel
, UNIX UNIX , , . , Ctrl-C (. . ) , Ctrl-C, , , Ctrl-C, , EINTR. , EINTR . userspace . . , -. userspace , . . : « , , , ».
— . UNIX- , SA_RESTART. , , . , , SA_RESTART ! , GNU/Linux select, poll, nanosleep . SA_RESTART!
- , , UNIX, . , -, cp , copy, UNIX , . cp , copy. UPD 2017-02-12: , - , cp copy, . , , .
Commands — Are These Real Words?
The basic AIX commands (and all UNIX system commands) are, for the most
part, very short, cryptic, two-letter command names. Imagine back years ago,
when computers had only very slow teletype keyboards and paper “displays.”
(Some of us aren’t imagining, we’re remembering!) Imagine also, people who
didn’t like typing long commands because there was such a long delay between
commands and the computer response. If there were any mistakes, the user had
to retype the whole thing (especially aggravating for folks that type with only
two fingers!).
Also, some UNIX commands came from university students and researchers who
weren’t bound by usability standards (no rules, merely peer pressure). They
could write a very useful, clever command and name it anything—their own initials,
for example (awk by Aho, Weinberger, and Kernighan), or an acronym
(yacc, Yet Another Compiler-Compiler).
- , UNIX — . , grep g/re/p ed. ( cat — concatenation, , :) : vmlinuz — gZipped LINUx with Virtual Memory support).
- printf . , ? , printf, UNIX , , . printf . H2O , .
UPD 2017-02-12: .
- , UNIX ( ) , UNIX, , creat (sic!) create. UPD 2017-02-12: , . No comments. , UNIX Plan 9, UNIX. create :) :)
- :
A child which dies but is never waited for is not really gone in that it still consumes disk swap and system table space. This can make it impossible to create new processes. The bug can be noticed whenseveral & separators are given to the shell not followed by ancommand without an ampersand. Ordinarily things clean themselves upwhen an ordinary command is typed, but it is possible to get into asituation in which no commands are accepted, so no waits are done;the system is then hung.The fix, probably, is to have a new kind of fork which creates aprocess for which no wait is necessary (or possible); also to limit the number of active or inactive descendants allowed to a process.
—
UNIX. - . . , . . . GNU/Linux - . . kill' . - : «It's for design».
- C. C UNIX, UNIX, C . , C , , . , , , , ⟦
4["string"]
⟧, ⟦sizeof ('a') != sizeof (char)
⟧ ( C, C++!), ⟦i++ + ++i
⟧, ⟦while (*p++ = *q++);
⟧ ( , ) .
. C . . ! C. . , . : 2015. 2015- !
, ( autotools, , cmake, , ), , npm (js) cargo (rust), portability library, C, , C , C, C ( ) , , user community. c-language.org , - . , , . ( cpp-language.org , :)) . , C C++. Haskell . Rust.
Rust, , , , , C. , , (, cargo — ). , - *GIT*, *GITHUB*. , *MARKDOWN*. , *SEMVER*. , *GIT*, *GITHUB*, *MARKDOWN*, *SEMVER*, *BUZZWORDS*, *BUZZWORDS* *HIPSTERS' BUZZWORDS*. . , . . , Rust — , - javascript. , Rust . . , -, , , , ? .
, , C/C++. , . : « C/C++ ?» .
, . , , signal , C: ⟦void (*signal(int sig, void (*func)(int)))(int);
⟧ .
- UNIX — legacy.
- UNIX (ext2 .) . , . , , . NTFS .
- UNIX shell PHP! , , , ? PHP. UNIX shell :) , , . ( ) . shell, , legacy, , , , , shell' ( UNIX) .
- . foo ⟦
\
⟧? : ⟦find foo -name '\\'
⟧. : ⟦find foo -name \\\\
⟧. . , UNIX shell, , (, , , ). , UNIX shell backslash expanding, find .
- touch' foo ( )? , : ⟦
find foo | while read A; do touch $A; done
⟧. , . 5 , ( ):
- , ⟦
read A
⟧, ⟦read -r A
⟧. - , ⟦
touch $A
⟧, ⟦touch "$A"
⟧. - , , ⟦
read -r A
⟧, ⟦IFS="" read -r A
⟧. - , ⟦
find foo
⟧ ⟦find foo -print0
⟧, ⟦IFS="" read -r A
⟧ ⟦IFS="" read -rd "" A
⟧ ( ). - , ⟦
touch "$A"
⟧ ⟦touch -- "$A"
⟧.
: ⟦find foo -print0 | while IFS="" read -rd "" A; do touch -- "$A"; done
⟧. , ? , , , POSIX ( ), touch ⟦--
⟧. , , ( ) ⟦./
⟧. , configure, autoconf' ? configure , shell'. ( . -exec xargs, ). (, , , foo, ).
- A , a@a. ? : ⟦
ssh a@a rm -- "$A"
⟧? ( , , .) ! ssh — chroot, setsid, nohup, sudo - , exec- (. . execve). ssh ( su) shell-, . . shell' ( exec- shell- — ). ssh , shell'. , : ⟦ssh a@a 'rm -- "$A"'
⟧? , A . , ssh . , : ⟦ssh a@a "rm -- '$A'"
⟧? , , . , , : ⟦ssh a@a "rm -- $(printf '%q\n' "$A")"
⟧. , ?
- a@a, — b@b, — c@c, — d@d, /foo? , :
ssh a@a "ssh b@b \"ssh c@c \\\"ssh d@d \\\\\\\"rm /foo\\\\\\\"\\\"\""
, ? , , , :
ssh a@a 'ssh b@b "ssh c@c '\''ssh d@d \"rm /foo\"'\''"'
, shell' Lisp, ssh ( , UNIX !), AST (abstract syntax tree), :
(ssh "a@a" '(ssh "b@b" '(ssh "c@c" '(ssh "d@d" '(rm "foo")))))
«? ? Lisp? Lisp?» , ? , . . .
- . A. a@a, — b@b, c@c, d@d , A. :) ( , :) , , , ).
- echo , . , , «Hello, world!», ( . UPD 2017-08-01). (, A) : ⟦
printf '%s\n' "$A"
⟧.
- , stdout stderr cmd /dev/null. : , — ?
cmd > /dev/null 2>&1
cmd 2>&1 > /dev/null
{ cmd > /dev/null; } 2>&1
{ cmd 2>&1; } > /dev/null
( cmd > /dev/null ) 2>&1
( cmd 2>&1 ) > /dev/null
, — 1-, 4- 6- , 2-, 3- 5- — . -, :)
- , . , Microsoft. . UNIX . , . (, , , Ubuntu), . , . . , . , shell , login shell' , argv[0] (?!). abuses ( misuses, , , - ) argv[0]. argv[0] . - . . , , .
- BSD sockets . , - - UNIX , . user space . . Windows ( /etc/hosts, C:\windows\system32\drivers\etc\hosts).
UPD 2017-02-12: .
« UNIX». , UNIX . (« », « » . .) « UNIX». , , . « UNIX» . : , , .
- « ». /etc/passwd, . , UNIX (passwd, fstab ) . . , ? /etc/fstab . , , ? fstab' . , fstab, , . , fstab-decode ( ). , ? :) . , - JSON XML. . , . , , ( ).
« ». . . sed, grep, awk . . , , , . . , XML, JSON, -. , , , . . , - . , , . - . , UNIX shell JSON XML. UNIX shell . , JSON.
! , , 1 . , , find'. , ls' ( xargs). ? : ⟦LC_ALL=C ls -l | while read -r MODE LINKS USER GROUP SIZE M D Y FILE; do if [ "$SIZE" -gt 1024 ]; then rm -- "$FILE"; fi; done
⟧. (LC_ALL , , ls). , , . -, , . , ls, , (. . SIZE FILE). , . :)
, ? - : ⟦ls | grep 'size > 1kb' | rm
⟧. , , , . . ls . ⟦-l
⟧ . , , ls. , ls . , , JSON. «» , . . , , - . grep, JSON. JSON «» , grep «», «size». , JSON size. , , , . 1kb. grep rm. rm «», . , , JSON , , — . rm . JSON . « ». ? ( ), . , Windows Powershell - .
- UNIX shell. UNIX. UNIX shell . . «» UNIX shell? , ( ) UNIX shell , . . , UNIX shell , , . , . . , , , , , . Larry Wall , UNIX shell - . UNIX shell' C. Perl. , Perl UNIX shell. , ( ) « UNIX» ( ). « » : «Those days are dead and gone and the eulogy was delivered by Perl». , UNIX shell, . . shell-. , , Perl.
UNIX shell. shell, : ⟦find foo -print0 | while IFS="" read -rd "" A; do touch -- "$A"; done
⟧. touch (, , xargs, , touch ; , ?). touch! ! . . UNIX shell , .
, UNIX shell . , . , «touch'» . , «» , shell, , .
- . shell shell' ( ), . . , sed'. , . jpg ppm . , grep, sed - . jpg. , . photoshop' gimp' - . , . UNIX.
. , . UNIX, . , « ». shell. , shell. ( , , « » shell ). , . , , . , .
. UNIX. . . UNIX . , , UNIX . , UNIX, « UNIX». , UNIX, .
«UNIX Style, or cat -v Considered Harmful».
. , , , cat — ( «» , , cat, ?). , « UNIX».
cat-v.org, , .
, , , , , . , , ? . .
«Systems Software Research is Irrelevant» , . , UNIX ( - ): «New operating systems today tend to be just ways of reimplementing Unix. If they have a novel architecture — and some do — the first thing to build is the Unix emulation layer. How can operating systems research be relevant when the resulting operating systems are all indistinguishable?»
:
«The Good, the Bad, and the Ugly: The Unix Legacy». , , , : «What makes the system good at what it's good at is also what makes it bad at what it's bad at. Its strengths are also its weaknesses. A simple example: flat text files. Amazing expressive power, huge convenience, but serious problems in pushing past a prototype level of performance or packaging. Compare the famous spell pipeline with an interactive spell-checker». : «C hasn't changed much since the 1970s… And — let's face it — it's ugly». , , .
UNIX . , , UNIX. UNIX, UNIX. IDE. . , , .
, UNIX, : Plan 9. , . UNIX. Plan 9 . «Systems Software Research is Irrelevant» Plan 9, .
James Hague, ( ) : «What I was trying to get across is that if you romanticize Unix, if you view it as a thing of perfection, then you lose your ability to imagine better alternatives and become blind to potentially dramatic shifts in thinking» (
).
«Free Your Technical Aesthetic from the 1970s», . (, , , , , ).
, , UNIX — . , , . « UNIX» , , . UNIX GNU/Linux. .
UPD 2017-02-14: , UNIX shell PHP . , ! UNIX shell , , . . UNIX shell . . , UNIX shell cmd. , Windows Powershell. , , - UNIX shell.
UPD 2017-02-14:
sshikov:
— , « , bash, ...» — unix way . .
, - ! , UNIX way. UNIX . - UNIX .
UPD 2017-02-14: , Windows UNIX- . UNIX, , UNIX , Windows. , Windows. UNIX. , , . « UNIX», . UNIX . . UNIX , « UNIX» . « UNIX», C Shell , , Web-. , Web- , , C ( C , ). - quirks , , C. , , . , , . , , . Windows ( - , Windows UNIX?). - Windows UNIX ( Powershell). UNIX. UNIX , , . UNIX. UNIX , .
UPD 2017-02-15:
habrahabr.ru/post/321652/#comment_10070776.
UPD 2017-02-15:
habrahabr.ru/post/321652/#comment_10071096.
UPD 2017-02-15:
habrahabr.ru/post/321652/#comment_10071714.
UPD 2017-02-16: :
habrahabr.ru/post/321652/#comment_10066240.
UPD 2017-02-16: , UNIX . , . . GNU/Linux :) . UNIX. , UNIX. UNIX , . James Hague, :
Enough time has passed since the silly days of crazed Linux advocacy that I'm comfortable pointing out the three reasons Unix makes sense:
1. It works.
2. It's reliable.
3. It stays constant.
But don't--do not--ever, make the mistake of those benefits being a reason to use Unix as a basis for your technical or design aesthetic. Yes, there are some textbook cases where pipelining commands together is impressive, but that's a minor point. Yes, having a small tool for a specific job sometimes works, but it just as often doesn't.
, , « UNIX». , . , . . . . . , . , , . , « UNIX» James Hague. , .
, «» UNIX . , . . . . , , . /usr make. , UNIX . , UNIX! Bell Labs Multics. : « Multics, - , ». . ? . . UNIX — . , .
, , , UNIX, . UNIX- , . , . , . , UNIX , . , UNIX . UNIX. ( !). C, UNIX shell, , « ». , C make, , UNIX. POSIX. : « IDE make». , , , , IDE — C, make shell.
, UNIX ( , ) . shell- — , . .
, shell, make , IDE, , GUI- . . :) - .
. , , autotools , make. autotools, m4, make shell. , , , .
UNIX:
Write programs that do one thing and do it well.
Write programs to work together.
Write programs to handle text streams, because that is a universal interface.
, UNIX shell . , REST. ( , JSON). — , . universal interface . JSON XML. , , - , .
shell. , , find -exec xargs. , . , . , shell' . - . shell' quirks, . .
.
:
iTWire: Systemd seems to depart to a large extent from the original idea of simplicity that was a hallmark of UNIX systems. Would you agree? And is this a good or a bad thing?
Linus Torvalds: So I think many of the «original ideals» of UNIX are these days more of a mindset issue than necessarily reflecting reality of the situation.
There's still value in understanding the traditional UNIX «do one thing and do it well» model where many workflows can be done as a pipeline of simple tools each adding their own value, but let's face it, it's not how complex systems really work, and it's not how major applications have been working or been designed for a long time. It's a useful simplification, and it's still true at *some* level, but I think it's also clear that it doesn't really describe most of reality.
It might describe some particular case, though, and I do think it's a useful teaching tool. People obviously still do those traditional pipelines of processes and file descriptors that UNIX is perhaps associated with, but there's a *lot* of cases where you have big complex unified systems.
And systemd is in no way the piece that breaks with old UNIX legacy. Graphical applications seldom worked that way (there are certainly _echoes_ of it in things like «LyX», but I think it's the exception rather than the rule), and then there's obviously the traditional counter-example of GNU emacs, where it really was not about the «simple UNIX model», but a whole new big infrastructure thing. Like systemd.
Now, I'm still old-fashioned enough that I like my log-files in text, not binary, so I think sometimes systemd hasn't necessarily had the best of taste, but hey, details…
UPD 2017-02-18: shell. , , find -exec xargs. , . , , , , -exec xargs — . « », UNIX shell.
, , , find -exec xargs.
touch'. « touch' foo ( )?» , touch' , grep' bar . . . file ⟦
grep bar file > tmp; mv tmp file
⟧. ? , , , . , :
find foo -print0 | while IFS="" read -rd "" A; do
grep -- bar "$A" > tmp
mv -- tmp "$A"
done
, , , foo, .
, IFS . , , , foo — ⟦
--
⟧. , . . ⟦
--
⟧ : «, ».
.
, xargs find -exec? touch', , .
: grep , . , shell', ⟦
sh -c
⟧. ? , ?
find foo -exec sh -c "grep -- bar '{}' > tmp; mv -- tmp '{}'" ';'
, ! , . :
find foo -exec sh -c 'grep -- bar "$1" > tmp; mv -- tmp "$1"' dummy '{}' ';'
? . $1. - , $1. xargs. ⟦
sh -c
⟧ $1.
, , , , , - .
. . , find. , . . . , find sublanguage, . . find'. , , , find' . truth value, . . . - . , truth value find , descend (. . ).
, , . ⟦
find -delete -name '*~'
⟧ ⟦
find -name '*~' -delete
⟧ - . , , . . find . . , . , -name truth value
true , . -name true, .
? , find sublanguage. shell. ( sed, — , awk — , UNIX' .) , find . . . find' , descend , callback. , UNIX shell . UNIX shell.
UPD 2017-08-01.
echo , . , , «Hello, world!», .
echo . , bash ⟦
echo "Hello, world!"
⟧.
, . bash , .
UPD 2018-05-31. . , : ⟦
-
⟧, . , , . . foo.