විධාන දෙකක ප්‍රතිදානය වෙනස් කරන්නේ කෙසේද?


187

සමාන නාමාවලි දෙකක අන්තර්ගතය සංසන්දනය කිරීමේ සරලම ක්‍රමය සමාන වනු ඇතැයි මම සිතුවෙමි

diff `ls old` `ls new`

නමුත් මෙය ක්‍රියාත්මක නොවන්නේ මන්දැයි මට පෙනේ; diffමා බලාපොරොත්තු වූවාක් මෙන් ධාරාවන් දෙකකට වඩා විධාන රේඛාවේ විශාල දිගු ලැයිස්තුවක් ලබා දෙනු ඇත. ප්‍රතිදාන දෙක කෙලින්ම වෙනස් වීමට මා සමත් වන්නේ කෙසේද?


Answers:


269

විධාන ආදේශනය `…`මඟින් විධාන රේඛාවේ ප්‍රතිදානය ආදේශ කරයි, එබැවින් diffනාමාවලි දෙකෙහිම ගොනු ලැයිස්තුව තර්ක ලෙස දකී. ඔබට අවශ්‍ය වන්නේ diffඑහි විධාන රේඛාවේ ගොනු නාම දෙකක් දැකීම සහ මෙම ලිපිගොනු වල අන්තර්ගතය නාමාවලි ලැයිස්තුගත කිරීම ය. ඒ මොකක්ද ක්රියාවලිය ආදේශන කරන්නේ.

diff <(ls old) <(ls new)

සඳහා වන තර්ක diffපෙනෙන්නේ /dev/fd/3සහ /dev/fd/4: ඒවා බාෂ් විසින් සාදන ලද පයිප්ප දෙකකට අනුරූප ලිපිගොනු විස්තර කරන්නන් ය. diffමෙම ලිපිගොනු විවෘත කළ විට , එය එක් එක් පයිප්පයේ කියවීමේ පැත්තට සම්බන්ධ වේ. එක් එක් පයිප්පයේ ලිවීමේ පැත්ත lsවිධානයට සම්බන්ධ වේ .


52
echo <(echo) <(echo)මෙය එතරම් සිත්ගන්නාසුළු යැයි කිසි විටෙකත් සිතුවේ නැත: ඩී
ඇක්වාරියස් පවර්

3
ක්‍රියාවලි ආදේශනයට සියලු කවච මඟින් සහාය නොදක්වයි , නමුත් නල යළි-යොමුවීම් පිළිවෙලට ක්‍රියා කරයි.
ඉර්ෆාන් 434

1
Ls විග්‍රහ කිරීම නිර්දේශ නොකරන බව සඳහන් කිරීම සඳහා unix.stackexchange.com/questions/128985/why-not-parse-ls
Katu

At කැටු ගැටළුව lsවන්නේ එය ගොනු නාමයන් හසුරුවීමයි. එහි ප්‍රතිදානය විග්‍රහ කිරීම බිඳෙන සුළුය (එය “අමුතු” ගොනු නාම සමඟ ක්‍රියා නොකරයි). ඩිරෙක්ටරි ලැයිස්තු දෙකක් සංසන්දනය කිරීම සඳහා, ප්‍රතිදානය නොපැහැදිලි වන තාක් කල් එය හරි ය. අත්තනෝමතික ගොනු නාම සමඟ, මේ සඳහා විකල්පයක් අවශ්‍ය වේ --quoting-style=escape.
ගිලෙස්ගේ SO- නපුරු වීම නවත්වන්න '

1
ill විල් පයිප්පයක් <(…)නිර්මාණය කරයි. මෙල්ඩ් පයිප්ප සමඟ ක්‍රියා නොකරන බව පෙනේ, එබැවින් ඔබට භාවිතා කළ නොහැක <(…). Zsh හි, ඔබට ප්‍රතිස්ථාපනය <(…)කළ හැකි =(…)අතර එය ක්‍රියාත්මක වන්නේ =(…)අතරමැදි ප්‍රතිදානයන් තාවකාලික ගොනුවක තබන බැවිනි. පහසු වාක්‍ය ඛණ්ඩයක් ඇතැයි මම නොසිතමි, ඔබට තාවකාලික ලිපිගොනු කළමනාකරණය කළ යුතුය.
ගිලෙස්ගේ SO- නපුරු වීම නවත්වන්න '

5

මාළු කටුව

මාළු කවචයේ දී ඔබ psub වෙතට නල කළ යුතුය . හෙරොකු සහ ඩොක්කු වින්‍යාසය ඉන් ඔබ්බට සංසන්දනය කිරීම සඳහා උදාහරණයක් මෙන්න :

bcompare (ssh me@myapp.pl dokku config myapp | sort | psub) (heroku config -a myapp | sort | psub)

1
තවත් චිත්‍රක වෙනස මෙවලමක් වන්නේ meldඑය විවෘත මූලාශ්‍රයක් වන අතර උබුන්ටු සහ ඊපෙල් ගබඩාවල තිබේ. meldmerge.org
phiphi

4

Zsh සඳහා, =(command)ස්වයංක්‍රීයව භාවිතා කිරීම තාවකාලික ගොනුවක් නිර්මාණය කර ගොනුවේ =(command)මාර්ගය සමඟ ප්‍රතිස්ථාපනය කරයි . විධාන ආදේශනය සමඟ, විධානයේ ප්‍රතිදානය$(command) සමඟ ප්‍රතිස්ථාපනය වේ.

එබැවින් විකල්ප තුනක් තිබේ:

  1. විධාන ආදේශනය: $(...)
  2. ක්‍රියාවලි ආදේශනය: <(...)
  3. zsh- රසකාරක ක්‍රියාවලි ආදේශනය: =(...)

zsh රසකාරක ක්‍රියාවලියක්, # 3, ඉතා ප්‍රයෝජනවත් වන අතර, විභේදන මෙවලමක් භාවිතා කරමින් විධාන දෙකක ප්‍රතිදානය සංසන්දනය කිරීම සඳහා එය භාවිතා කළ හැකිය, උදාහරණයක් ලෙස සංසන්දනය කරන්න:

bcomp  =(ulimit -Sa | sort) =(ulimit -Ha | sort)

සංසන්දනය කිරීමෙන් ඔබ්බට, සංසන්දනය දියත් කර එය සම්පූර්ණ වන තෙක් බලා සිටින බැවින් ඔබ bcompඉහත (වෙනුවට bcompare) භාවිතා කළ යුතු බව සලකන්න . ඔබ භාවිතා කරන්නේ නම් , එය සැසඳීම දියත් කරන අතර විධාන වල ප්‍රතිදානය ගබඩා කිරීම සඳහා නිර්මාණය කරන ලද තාවකාලික ලිපිගොනු අතුරුදහන් වේ.bcompbcompare

වැඩි විස්තර මෙතැනින් කියවන්න: http://zsh.sourceforge.net/Intro/intro_7.html

මෙයද සැලකිල්ලට ගන්න:

කවචය තාවකාලික ගොනුවක් සාදන අතර, විධානය අවසන් වූ විට එය මකා දමයි.

zsh (එනම් # 2 සහ # 3) සහය දක්වන ක්‍රියාවලි ආදේශක වර්ග දෙක අතර වෙනස පහත දැක්වේ:

ඔබ zsh හි මෑන් පිටුව කියවන්නේ නම්, <(...) යනු ක්‍රියාවලි ආදේශනයේ තවත් ආකාරයක් වන අතර එය = (...) ට සමාන වේ. මේ දෙක අතර වැදගත් වෙනසක් තිබේ. <(...) නඩුවේදී, කවචය ගොනුවක් වෙනුවට නම් කරන ලද පයිප්පයක් (FIFO) නිර්මාණය කරයි. ගොනු පද්ධතිය පුරවන්නේ නැති නිසා මෙය වඩා හොඳය; නමුත් එය සෑම අවස්ථාවකම ක්‍රියාත්මක නොවේ. ඇත්ත වශයෙන්ම, අප ඉහත උදාහරණ වල = (...) වෙනුවට <(...) ආදේශ කර ඇත්නම්, fgrep -f <(...) හැර අනෙක් සියල්ලම වැඩ කිරීම නවත්වනු ඇත. ඔබට පයිප්පයක් සංස්කරණය කළ නොහැක, නැතහොත් එය තැපැල් ෆෝල්ඩරයක් ලෙස විවෘත කළ නොහැක; කෙසේ වෙතත්, fgrep ට පයිප්පයකින් වචන ලැයිස්තුවක් කියවීමේ කිසිදු ගැටළුවක් නොමැත. Foo | සිට වෙනස <(foo) තීරුව ක්‍රියා නොකරන්නේ මන්දැයි ඔබ සිතනු ඇත diff - තීරු වැඩ; මෙයට හේතුව වෙනස එහි තාවකාලික ගොනුවක් නිර්මාණය කරන අතර එය එහි එක් තර්කයක් බව දුටුවහොත් - එහි සම්මත ආදානය තාවකාලික ගොනුවට පිටපත් කිරීමයි.

යොමුව: /unix/393349/difference-between-subshells-and-process-substitution


2
$(...)ක්‍රියාවලිය ආදේශ කිරීම නොවේ, එය විධාන ආදේශනයකි. <(...)ක්‍රියාවලි ආදේශනයකි. උපුටා ගත් ඡේදයේ කිසිසේත් සඳහන් නොවන්නේ එබැවිනි $(...).
මුරු

0

පිළිගත් පිළිතුරේ විස්තර කර ඇති තාක්‍ෂණය මම බොහෝ විට භාවිතා කරමි:

diff <(ls old) <(ls new)

නමුත් මම සාමාන්‍යයෙන් එය ඉහත උදාහරණයට වඩා සංකීර්ණ විධාන සමඟ භාවිතා කරන බව මට පෙනේ. එවැනි අවස්ථාවන්හි දී dif විධානය සකස් කිරීම කරදරයක් විය හැකිය. අනෙක් ඒවාට ප්‍රයෝජනවත් විය හැකි විසඳුම් කිහිපයක් මම ඉදිරිපත් කර ඇත්තෙමි.

වෙනස ක්‍රියාත්මක කිරීමට පෙර 99% ක්ම අදාළ විධානයන් අත්හදා බලන බව මට පෙනී ගියේය. එහි ප්‍රති dif ලයක් ලෙස මට වෙනස් කිරීමට අවශ්‍ය විධානයන් මගේ ඉතිහාසයේ තිබේ ... ඒවා භාවිතා නොකරන්නේ ඇයි?

අවසාන විධාන දෙක ක්‍රියාත්මක කිරීම සඳහා මම Fix Command (fc) bash buildin භාවිතා කරමි:

$ echo A
A
$ echo B
B
$ diff --color <( $(fc -ln -1 -1) ) <( $(fc -ln -2 -2 ) )
1c1
< B
---
> A

Fc ධජ:

-n : අංකයක් නැත. එය ලැයිස්තුගත කිරීමේදී විධාන අංක යටපත් කරයි.

-l : ලැයිස්තුගත කිරීම: විධාන සම්මත ප්‍රතිදානයේ ලැයිස්තුගත කර ඇත.

-1 -1ඉතිහාසයේ ආරම්භක හා අවසාන ස්ථානගත කිරීම වෙත යොමු වන්න, මේ අවස්ථාවේ දී එය අවසාන විධානයේ සිට අවසාන විධානය දක්වා ලැබෙන අවසාන විධානය දක්වා වේ.

අවසාන වශයෙන් අපි මෙය ආවරණය $()කරන්නේ විධානය උප කුලකයකින් ක්‍රියාත්මක කිරීම සඳහා ය.

නිසැකවම මෙය ටයිප් කිරීම සුළු වේදනාවක් වන බැවින් අපට අන්වර්ථයක් නිර්මාණය කළ හැකිය:

alias dl='diff --color <( $(fc -ln -1 -1) ) <( $(fc -ln -2 -2 ) )'

නැතහොත් අපට ශ්‍රිතයක් නිර්මාණය කළ හැකිය:

dl() {
    if [[ -z "$1" ]]; then
        first="1"
    else
        first="$1"
    fi
    if [[ -z "$2" ]]; then
        last="2"
    else
        last="$2"
    fi
    # shellcheck disable=SC2091
    diff --color <( $(fc -ln "-$first" "-$first") ) <( $(fc -ln "-$last" "-$last") )
}

එය භාවිතා කිරීමට ඉතිහාස රේඛා නියම කිරීමට සහාය වේ. දෙකම භාවිතා කිරීමෙන් පසු අන්වර්ථය මා කැමති අනුවාදය බව මට පෙනේ.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.