Неліктен CD бағдарлама емес?

Мен әрдайым cd - бұл бағдарлама емес, бірақ ешқашан жауап таба алмады деп ойладым.

Неліктен бұлай екенін кім біледі?

115
Unix cd командасының бөлек бағдарлама екенін оқуды (қайда таба алмаймын) есімде. Қабықша оны fork емес, тек exec әдісімен өңдейді. Және cd жасалған кезде sh exec. Мен бұл шынайы тарих екенін білмеймін.
қосылды автор John Sibly, көзі
@Mikel: Мен бұл пайдасыз болып көрінгенімен келісемін, бірақ мен оқыған cd туралы әңгіме жай ғана айтып тұрдым. Мен оның аспектісі туралы қателеспесем, енді @jlliagre толығырақ толтырды.
қосылды автор John Sibly, көзі
@camh, бұл шындық. Мен сондай-ақ Dennis M. Ritchie, «Unix Time Sharing System Evolution», AT & T Bell Laboratories Техникалық журналы 63 (6), 2-бөлім, 1984 жылғы мақалада жаздым.
қосылды автор Eric Scrivner, көзі
Бұл не нәрсе еді? Егер ол арнайы өңдеуді қосатын болса, ол chdir syscall-ға қоңырау шалуы мүмкін. Дерек көздері: v1 v5 v7 (бірінші нұсқасы Bourne қабық)
қосылды автор Mikel, көзі

7 жауаптар

cd командасы «ағымдағы жұмыс каталогын» өзгертеді, дұрыс?

«Ағымдағы жұмыс каталогы» - бұл әрбір процесс үшін бірегей болып табылатын сипат.

Сонымен, егер cd бағдарлама болса, ол келесідей жұмыс істейтін:

  1. cd foo
  2. the cd process starts
  3. the cd process changes the directory for the cd process
  4. the cd process exits
  5. your shell still has the same state, including current working directory, that it did before you started.
162
қосылды
Сіздің бес қадамыңыз дұрыс, бірақ «егер cd - бұл бағдарлама, егер ол өз жұмысын атқаратын болса, ол cd «.
қосылды автор Eric Scrivner, көзі
Жүйелік бағдарламашы емеспін, сонымен қатар қабықпен өзара әрекеттесуді білмейтіндіктен, мен оның қабырғасының ағымдағы жұмыс каталогын ашуын күткен болар едім және CD-ге бұл қасиетке қол жеткізетін және өзгертетін бағдарлама болар едім. Бұл жауапты қарап шыққаннан кейін түсіну, ол шын мәнінде көптеген себептер бойынша жұмыс істейтініне оңтайлы болуы мүмкін.
қосылды автор p01nd3xt3r, көзі

cd in addition to being a shell builtin, is actually also a program on POSIX compliant OSes. They must provide independent executables for regular utilities, like cd. This is for example the case with Solaris, AIX, HP-UX and OS X.

Әлбетте, ішкі код әлі де міндетті болып табылады, себебі оның сыртқы орындалуы ағымдағы қабық каталогын өзгертпейді. Дегенмен, ол әлі де пайдалы болуы мүмкін. POSIX осы cd командасының қалай қолданылатындығын болжайтын мысал:

find . -type d -exec cd {} \;

POSIX жүйесінде бұл oneliner сізде cd рұқсат етілмеген барлық каталогтар үшін қате туралы хабар береді. Көптеген Gnu/Linux дистрибутивтерінде бұл қате туралы хабармен бірге сәтсіздікке ұшырайды:

find: `cd': No such file or directory

Міне, сіздің түпнұсқа Unix авторының бірі « Неліктен бағдарлама емес? » деген сұраққа жауап. Unix-тегжейлі іске қосылған кезде cd (бұл кезде chdir ) жазылған сыртқы бағдарлама болды. fork бірінші іске қосылғаннан кейін ол күтпеген жерден жұмысын тоқтатты.

Котировка Деннис Ритчи :

Біздің қуанышымыздың ортасында chdir (ағымдағы каталогты өзгерту) командасы жұмысын тоқтатты. Кодты көп оқып, шиттерді қосу chdir қоңырауын қалай бұзғаны туралы алаңдатты. Ақыр соңында ақиқат көрінді: ескі жүйеде chdir әдеттегі команда болды; терминалға тіркелген (бірегей) процестің ағымдағы каталогын реттеді. Жаңа жүйе бойынша chdir командасы оны орындау үшін жасалған процестің ағымдағы каталогын дұрыс өзгертіп жіберді, бірақ бұл процесс дереу тоқтатылып, ата-аналық қабықшасында ешқандай әсер етпеді! Шмитті шұңқыр ішіне жасаған арнайы команда жасау қажет болды. Бірнеше командалық ұқсас функциялардың бірдей қасиеті бар, мысалы, логин.

Source: Dennis M. Ritchie, “The Evolution of the Unix Time-sharing System”, AT&T Bell Laboratories Technical Journal 63(6), Part 2, Oct. 1984, pp.1577–93

Unix Нұсқа 1 (1971 ж. Наурыз) chdir қолмен бетінде :

Әрбір пәрменді орындау үшін жаңа процесс жасалатындықтан, егер ол қалыпты деп жазылса, chdir тиімсіз болады команда. Сондықтан ол танылды және орындалды Shell.

97
қосылды
OSX 10.7.2 нұсқасынан cat/usr/bin/cd #!/bin/sh # $ FreeBSD: src/usr.bin/alias/generic.sh, v 1.2 2005/10/24 22:32:19 cperciva Exp $ # Бұл файл қоғамдық игілік. салынған echo $ {0 ## * /} | tr [: жоғарғы:] [: төменгі:] `$ {1 +« $ @ »}` осылайша жасалатын жалғыз нәрсе жасырылған пәрменді орындау үшін бүркеншік ат ретінде әрекет етеді
қосылды автор Nick Watts, көзі
@Kaz: егер сіз екі нұсқаны орындауды байқасаңыз, chdir қоңырауына қоңырау шалып, екі жағдайда да орындалады. Міне, мен «Олар бірдей нәрсені жасайды» дегенді білдіреді.
қосылды автор Eric Scrivner, көзі
@Warren Young алғыс
қосылды автор Eric Scrivner, көзі
Әрине, қоңырау шалудың командалық әсері әртүрлі екенін білемін, бірақ бұл жай ғана семантика. Айталық, «бірдей нәрсені жасау» дегенім «банк шотына 100 доллар депозит» деп айтайын, сол себепті оның есебінен маңызды емес.
қосылды автор Eric Scrivner, көзі
@Kaz: Мен жай ғана факт туралы хабарлағанда, мені ақымақ деп айтпа. Сіз POSIX-пен келіспесеңіз немесе келіспесеңіз, бірақ хабар алмасушыны атуға болмайды.
қосылды автор Eric Scrivner, көзі
@Kaz, олар мүлдем өзгеше емес. Олар бірдей нәрсені жасайды, бірақ тек салынған тек ағымдағы қабықшаға әсер етеді.
қосылды автор Eric Scrivner, көзі
@Nils Барлық Unix қабықшаларын іске қосу cd салынғанын береді. Бұл әрекетті орындамау қиындық тудырмайды (сыртқы қабаттың бұл ақпаратты берудің жолын беру қажет) және өте қауіпті.
қосылды автор Eric Scrivner, көзі
Барлық раковиналар негізінен cd-ды бірдей жолмен жүзеге асырады, яғни, chdir деп аталады: pubs.opengroup .org/onlinepubs/9699919799/functions/chdir.htm & zwnj; l
қосылды автор Eric Scrivner, көзі
@Jarrod Robertson Әрбір Unix жеткізушісі бұл пәрмендерді ұнататын жолмен жүзеге асырады. Орнатылған CD және сыртқы CD сияқты бірдей әрекет ету керек, сценарийден кірістірілген бағдарламаны іске асыру әдісі дұрыс және ақылды болып табылады.
қосылды автор Eric Scrivner, көзі
@Kaz: алдыңғы түсініктеме.
қосылды автор Eric Scrivner, көзі
@Ilmari Karonen: cd пәрмені ештеңе істемейтінін айту дұрыс емес. Ол сіздің каталогыңызды ұсынылған аргументке өзгерте алатынын және сәйкесінше статусын қайтаратындығын тексереді.
қосылды автор Eric Scrivner, көзі
@Totor Толық параграфты оқып шығу керек: «Арнайы кірістірілген утилиталарда сипатталған арнайы қондырмалар емес, стандартты утилиталар, соның ішінде үстелдегі тұрақты кірістірілген элементтерді қоса, олар POSIX.1-2008 жүйесінің жүйелік интерфейстерінің көлемінде анықталған функциялардың exec тұқымдары арқылы қол жеткізуге болады және оны тікелей «стандартты утилиталар»
қосылды автор Eric Scrivner, көзі
@jlliagre: Менің пікірімді жойды және -1. Сіз дұрыс айтасыз, POSIX сыртқы cd деп айтуға тиіс. Әйтпесе.
қосылды автор Warren Young, көзі
POSIX cd page -де де айтылады: «cd ағымдағы қабықшаның орындалуына әсер етеді қоршаған орта, үнемі кіріктірмелі қабырға ретінде қарастырылады. «.
қосылды автор Mikel, көзі
Ол қызықты. Сіз берген сілтеме cd - «тұрақты кіріктірілген утилита» деп аталады, ол «exec отбасының функциялары арқылы қатынасуға болатын [...] және env , find , nice , nohup код> уақыт , xargs ) «). Дегенмен, spec cd үшін өзіндік «Егер ол кішігірімде немесе жеке қызметтің орындалу ортасында шақырылса [...], ол қоңырау шалушы ортасының жұмыс каталогына әсер етпейді» деп айтады.
қосылды автор Scott McMillin, көзі
... сондықтан, POSIX, тәуелсіз cd орындалатын файл болуы керек, бірақ ол ештеңе жасамауы керек (қате дәлелдермен шақырылса, қате туралы хабарларды шығару мүмкін емес). Қызық.
қосылды автор Scott McMillin, көзі
Қызықты. бірақ cd қолданылмайтын кез-келген қабықшасы бар пәрмен ретінде орнатылады және бұл сыртқы пәрменді нақты шақырады?
қосылды автор Ero Sɘnnin, көзі
Сондықтан cd сыртқы cd файлын сәтті орындауға мүмкіндігі бар болса, тексеру қажет болса, сыртқы cd мәні бар. Тамаша - бұл қазіргі кезде мен өзімнің сценарийіне қажет ...
қосылды автор Ero Sɘnnin, көзі
@Totor сондықтан Linux Posix емес. Мұнда жаңа ешнәрсе жоқ.
қосылды автор Ero Sɘnnin, көзі
@jlliagre Жақсы нәрсе. Оны көрсету үшін рахмет.
қосылды автор George M, көзі
Міне, осы түзуді алуыма рұқсат етіңіз ... Егер Unix үшін өз қабығын жасайтын болсам, онда мен нақты жағдайды шешуге тура келеді? Неліктен ол әрқайсысы қабықшаны әртүрлі түрде іске асыратын болса, ол бірінші кезекте де бар?
қосылды автор Catija, көзі
Қасіретін қасіретін - мен/usr/bin/cd жасай аламын, ол раковинаның жұмыс каталогын өзгертеді, бірақ оны іске қосқан кезде сіздің шақыруыңыз жаңартылмайды.
қосылды автор Aaron K., көзі
@jlliagre Mea culpa, сіз дұрыссыз. Менің Debian жүйесі бұл POSIX-неске ұнамайды, мен қорқамын ...
қосылды автор Totor, көзі
@jlliagre @Nils @IlmariKaronen Олар міндетті < i> емес тұрақты утилиталар үшін тәуелсіз орындалатын файлдарды қамтамасыз етеді, мысалы cd ! Сіз сілтеген бет: «Тұрақты кіріктірме утилиталардағы [ cd ]» деп аталған утилиталар жиі кіріктірілген формада ұсынылады ». cd бетінде «cd ағымдағы қабықшаның орындалу ортасына әсер еткендіктен, ол үнемі бекітілген қабығы ретінде берілген әрдайым » болып табылады. Сіз неге міндетті сыртқы бағдарлама ретінде бар деп айтасыз?
қосылды автор Totor, көзі
@jlliagre Жауабыңыздың жақсартылған нұсқасы үшін менің алғашқы түсініктемді және +1 болдырмады.
қосылды автор M.A. Golding, көзі
@jlliagre Мен «орындалатын» деген сөзді пайдаланбадым, мен ештеңені түсінбеймін. Мен тек қана OS X жүйесінде қабықтың жұмыс каталогын өзгертетін бағдарлама - бұл қабықтың өзі екенін айтқым келеді.
қосылды автор M.A. Golding, көзі
@Rudolf Сіз мұнда қалай пайдаланасыз? IMHO сценарийі - бұл бағдарлама, бұл жай, жақсы, сценарий :). Бірақ ол әлі күнге дейін тапсырманы орындау үшін компьютермен түсіндірілетін командалардың сериясы және бірнеше рет сақталып, іске қосылуы мүмкін.
қосылды автор user18928, көзі
Жақсы, егер бұл дұрыс болса, бұл POSIX-тегі ең ақылсыз нәрсе болмас еді.
қосылды автор Nathan V, көзі
@jiliagre «Олар бірдей нәрсені жасайды, бірақ тек қана салынған қабырға ағымдағы қабықшаға әсер етеді» дегенді білдіреді. Мен бұл пішіннің қалай жаза алатыныңызды түсінбеймін, бірақ Enter енгізіңіз. :)
қосылды автор Nathan V, көзі
Операция бір дәл осындай деректермен бірдей ортада/ауқымда жұмыс істейтін болса, бірдей нәрсені ғана жасайды. chdir жасырын емес дәлелге ие: ағымдағы жұмыс каталогының айнымалысы жұмыс істейтін қоңырау процесінің идентификациясы. Бұл дегеніміз, процесс a және chdir процессінде chdir бірдей операция болып табылмайды (тіпті бірдей абсолютті жолмен аталса да). Дерекқор транзакциясын ойлап көріңіз. Менің банктік шотымға $ 100 депозитім банк операциялары бойынша 100 долларлық депозитке ұқсас операция болып табыла ма? Егер солай болса, банк оларды араласып жатқанын ойламаңыз.
қосылды автор Nathan V, көзі
Осылайша, /usr/bin/cd және cd барлық мақсаттары мен мақсаттары үшін мүлдем басқа нәрселер.
қосылды автор Nathan V, көзі

Баш кіріспе бөлімінен ( Қабан дегеніміз не? ):

Сонымен қатар, қабықшалар кірістірілген командалардың шағын жиынтығын (салынған)   функционалдылықты іске асыру мүмкін емес немесе қолайсыз   бөлек коммуналдық қызметтер. Мысалы, cd , break , жалғастыру және    exec ) қабықшаның сыртында орындалмайды, себебі олар   қабықтың өзін тікелей басқарады. тарих , getopts ,    kill немесе pwd кірістірілген   жеке утилиталар, бірақ олар салынған ретінде пайдалануға ыңғайлы   командалар. Барлық қабықшалар салынған кейіннен сипатталған   бөлімдер.

45
қосылды

Сәуір айындағы Fool's үшін, мен жазған cd оқшау нұсқасы .

Ешкім де әзіл қалмады. Көңілді.

Қапшыққа cd кіргеніне сенімді болмасаңыз, оны жүктеп, оны құрастырыңыз және оны көріңіз.

Оның адам бетін де оқыңыз. :)

28
қосылды
Gnu/Linux-ді POSIX-ке үйлестіретін біреуді көргеніңіз жақсы. Сіздің іске асыру - бұл жақсы әзіл емес, бірақ шын мәнінде Linux дистрибутивтерінен жоғалған нәрсе ...
қосылды автор Eric Scrivner, көзі
Менің ойымша, POSIX мәселесіне сүйене отырып, келесі жылы тағы бір рет қайталап көремін. ;)
қосылды автор Warren Young, көзі
Шынында пайдалы код! :-)
қосылды автор Akash Dubey, көзі

Қабықтағы cd командасы бөлек процесс бола алмайды, себебі Unix жүйесінде басқа процестің ағымдағы жұмыс каталогын (тіпті ата-аналық процесс емес) өзгерту механизмі жоқ.

Егер cd басқа процесс болса, онда Unix жүйесіндегі мүмкін болмайтын ата-анасының (shell) ағымдағы жұмыс каталогын өзгерту қажет. Оның орнына cd - арнайы құрылған команда. Қабықша chdir() және fchdir() сияқты өз функцияларын өзгертеді.

Ескерту: ядро ​​әрбір процестің ағымдағы жұмыс каталогының инодтық санын сақтайды. Бала процесі оның cwd ата-анасынан мұраға алады.

4
қосылды

Менің ойымша, бірде-бір адам жоғалады, бұл ағымдағы каталог - бұл айнымалы ортаны, ол әр бағдарлама өзгеруі мүмкін. Егер сіз ағымдағы айнымалы айнымалылар тізімін көру үшін «экспорттау» пәрменін пайдалансаңыз, мыналар болады:

declare -x PWD="/home/erfan"

сіздің нәтижелеріңізде. Осылайша, 'cd' командасы арқылы біз бұл ішкі айнымалыны өзгерткіміз келеді. Менің ойымша, егер біз тырысамыз, біз кез келген PWD ауыспалы айнымалы қабықтың қабықшасында, әрине. Ұнайды:

cder    #change current PTY $PWD variable

Бірақ қалыпты жағдайда қажет емес деп ойлаймын. Басқаша айтқанда, bash (немесе кез-келген қабық) арқылы анықталған ішкі айнымалы мәнін өзгерту үшін көмек аламыз.

1
қосылды
Bourne қабығы ағымдағы жұмыс каталогын (CWD) $ PWD ретінде көрсетеді, бұл бастапқы сақтау орны емес; нақты орналасуы ядро ​​процесінің әрбір құрылымында. Сондықтан CWD «қоршаған ортаны айнымалы» деп айту дұрыс емес. Егер сіз ол ұсынған тәсілмен жұмыс істесеңіз, C-екі сызықша оны .. жолын басып шығарады: #include < code> int main (void) {chdir («..»); puts (getenv («PWD»)); } (C қабықшалар CWD-ді орнына% cwd ретінде көрсетеді.)
қосылды автор Warren Young, көзі
Бұл айнымалы мәнді тек CWD-де ешқандай жанама әсер етпей жазады. Бұл келесідей екенін көрсету үшін жақсы тест: #include int main (void) {char ac [99]; setenv («PWD», «/», 1); puts (getcwd (ac, sizeof (ac))); } Бұл бағдарламаны бастаған каталогты / емес, көрсететін болады.
қосылды автор Warren Young, көзі
Жоқ, мен сізге айтып отырмын, $ PWD тек Bourne қабығына мағынасы бар. Бұл қабықтың қабығы сценарийлерде білетін нәрсені байланыстырудың бір жолы, сондықтан оны табу үшін pwd деп аталмау керек. $ PWD мәніне байланысты кез-келген жеке бағдарлама сенімсіз болады.
қосылды автор Warren Young, көзі
Менің ойымша, әрбір процесте жұмыс каталогы және жол айнымалысы бар. Осылайша сіз chdir арқылы осы атрибут өзгертуге ғана. Shell-де бұл атрибут бар, ал CD-де біз осы атрибутты өзгертеміз.
қосылды автор Octavarium, көзі
қолданбаға қосымша жолдарды қосуға мүмкіндік береді. #include int main (void) {chdir («..»); puts (getenv («PWD»)); setenv (P «PWD», «/», 1); puts (getenv («PWD»)); } Нәтиже ретінде не болады?
қосылды автор Octavarium, көзі

cd - командалық кірістірілген команда. Қалай оңай. Адамның бәрі бұл туралы айтады. cd пәрмені барлық аудармашылар үшін жұмыс каталогын және барлық ағындарды (бұрандалы ортада) өзгертеді.

0
қосылды
cd кірістірілген өте жақсы техникалық себеп бар. Мен Сізге ең жоғарғы бағаланатын жауаптарды оқып, жауаптың қалай жақсартылатынын қарастыруға кеңес берер едім.
қосылды автор Swaroop C H, көзі
Бірақ ол неге сұрағына жауап береді.
қосылды автор Swaroop C H, көзі
Себебі қабық сіздің жұмыс істейтін дирлеріңізге ($ PDW ...) немесе cdable_vars туралы қамқорлық ететін орта болып табылады. Бұл салынған барлық пайдаланушыға көрінетін пәрмендер ағымдағы жұмыс каталогын өзгертуі тиіс. Сіз оны дәл осылай сынап көре аласыз: cd.c файлын құрастырмаңыз және cdable_vars барлық ортаға қамқорлық жасауға тырысатын өзіңіздің cd сценарийін жазуға тырысыңыз. Бұл мәселе, сонымен қатар, әзірлеушіге қатысты. Мен бұл мәселені неғұрлым тереңірек егжей-тегжейлі жауап бере алар деп ойлаймын.
қосылды автор Alan Sparks, көзі
Ең жоғары бағаланған жауап, мен оқыған ең нашар болды! Бірақ иә? Мен кіммін!
қосылды автор Alan Sparks, көзі