UNIX | Taha Yavuz Bodur weblogging..
August 14, 2011 · 00:31
Shell – Script Çalıştırma – Ortam Değişkenlerini Set Etmek
lifeinbeta@lifeinbeta:~/CSWORKS/C/soexample$ set LD_LIBRARY_PATH = /opt/lib:$LD_LIBRARY_PATH
lifeinbeta@lifeinbeta:~/CSWORKS/C/soexample$ echo $LD_LIBRARY_PATH
yaptım, ama olmadı, çünkü;
Shells and Shell Scripts yazısında açıklandığı üzere:
Running Scripts kısmında;
Bir Shell Script’ini çalıştırmak için üç farklı yol vardır:
Direct Execution: Bir Shell Script‘ini çalıştırabilmek için en basit yol, chmod ile text file‘ı executable yapmaktır. Bundan sonra, script, eğer current working directory‘de ise ya da shell‘in PATH‘inde tanımlı ise, adı yazılarak çalıştırılabilir.
Bir script çalıştırıldığında, yeni bir shell yaratır ve bu yeni shell‘de script içinde belirtilmiş olan her bir komutu sırayla çalıştırır. Script‘in sonuna gelindiğinde, yeni shell kapanır. Yeni shell’in script dolayısıyla sistemde yaptığı değişiklikler, shell sonlandığında kaybolur.
Shell Execution: Bir script’i yeni shell context’i içinde çalıştırmanın diğer yolu, shell’i script’i parametre olarak verip çalıştırmaktır. Bu aslında Direct Execution‘dur. Doğrudan, sh‘ı çalıştırarak, sh options değiştirilebilir.
csh -x change şeklinde çalştırıldığında, çalışan komutlar da output‘ta gösterilir.
source Execution: Bir script‘i mevcut shell’de çalıştırabilmek için, internal shell command olan source kullanılır. Çalıştırma, mevcut shell’in context‘inde olduğu için, script‘in shell’de yaptığı değişiklikler, shell sonlanıncaya kadar durur.
Burada, her shell‘in bir child process olduğu ve scope’u olduğu anlatılıyor. Benim karşılaştığım problem ise, aslında, tam olarak bununla ilgili değil ama, sistem geneli ortam değişkenleri scope‘u, environment scope – yani kısaca Environment ile ilgili.
Yukarıda yaptığım shell işlemlerinde, öncelikle bir terminal açmıştım. Terminal, bir shell başlattı. Bu yeni shell‘de yazmış olduğum, set komutu bir ortam değişkenini değiştirdi. Yeni bir terminal, yani shell açıp bu ortam değişkenini yazdırdığımda değerinin değişmediğini gördüm.
A – Bourne Shell mark for export flag‘de belirtildiği gibi:
Bir değişkeni ortam – environment‘da bulundurabilmek için, o değişkeni explictly export etmek gerekir ki diğer programlar da onu bulabilsin.
Bunu yapmanın bir diğer yolu, set‘i -a option‘u ile birlikte kullanmaktır:
Bu yapıldığında, değiştirilen ya da yaratılan değişken export edilir.
Bu işlemlerin ve export‘un sebebi, UNIX – MAN Sayfaları ile Dosya Okuma-Arama Komutları ve Ortam Değişkenleri yazısında yazıyor.
Ayrıca, Environment Variables‘a bakılabilir.
Yukarıdaki anlatılanlardan anlaşılacağı gibi:
Yukarıdaki, shell‘de script çalıştırma yöntemlerinden ilkini kullandım. export ile ortam değişkenini değiştirdim. Ancak, açık olan shell, yani child process sonlanana kadar geçerli olacaktır. Bu yüzden her defasında bunu set etmek yerine,
Uygun login dosyası – GNU Bash Shell için .bash_profile kullanılarak her oturum için LD_LIBRARY_PATH otomatik olarak set edilebilir.
.bashrc‘de şunu yazdım:
lifeinbeta@lifeinbeta:~/CSWORKS/C/soexample$ vim ~/.bashrc
lifeinbeta@lifeinbeta:~/CSWORKS/C/soexample$ source ~/.bashrc
lifeinbeta@lifeinbeta:~/CSWORKS/C/soexample$ printenv LD_LIBRARY_PATH
işlemlerini yaptım. En son,
.bashrc‘de şunlar yazılıydı:
Filed under Shell, UNIX
May 26, 2011 · 22:21
UNIX – i-node, Hard Link ve Soft Link
Making symlinks to replace GLUT yazısını okurken;
ln -s /usr/lib/libfreeglut.so.0.2.0 /usr/lib/libglut.so.3
ln -s /usr/lib/libfreeglut.so.0.2.0 /usr/lib/libglut.so.3.7
ln -s /usr/lib/libfreeglut.so.0.2.0 /usr/lib/libglut.so.3.7.0
ile karşılaştım ve neden link yapılmaya gerek duyulduğunu merak ettim.
Değişik versionlardaki .so ları(.so,.so.3,.so.3.9) tek bir versiyona(.so.0.2.0) link ettik. Ayrıca, kütüphane ismini(libglut) de daha belirgin bir hale(libfreeglut) getirdik. Artık, libglut kütüphanelerinden herhangi biri yerine sadece libfreeglut.0.2.0‘ı kullanabiliriz. Sanırım, bu şekilde olası karmaşaları önledik.
UNIX’te her dosya, dosya içeriğiyle ilgili önemli bilgiler tutan, i-node denilen, bir veri yapısıyla ilişkilendirilir. i-node; dosyanın boyutu, son erişim zamanı, son değiştirme zamanı, kendisinin en son değiştirilme zamanı, dosyanın sahibi, izin bilgileri, dosyanın disk üzerinde bulunan verisine olan pointer‘ları ve dosyaya verilen link sayısını tutar. UNIX’te dizinlere karşılık gelen veri yapısı, dizindeki dosya isimlerini tutar. Bir dosya ismi, ilişkili olduğu i-node‘a pointer dır.
Dosya ismi, veri yapısına bir pointer ise bu veri yapısına erişmek için başka pointer‘lar da kullanabiliriz. Bunun çeşitli amaçları vardır. Dosya ismi harici böyle pointerlara link denir. Hard Link ve Soft Link vardır.
Hard Link, bir dosyanın i-node‘una pointer‘ olan başka bir dosyadır. Elimizde file1 olsun. İçeriği bravo, milord! 🙂 olsun. Bu dosyaya file2 isimli bir dosyayı link edelim.
Sağdan sola okunursa, file2,file1‘e link edilmiştir. Şimdi cat file2 dersek, file2‘nin de bravo milord! dediğini görürüz. Yani, bu iki dosya ismi de aynı i-node‘a pointer oldu.
Soft/Symbolic Link, oluşturulduğunda, file2 olsun ve file1‘e link edilmiş olsun, file2‘nin içerisinde file1 yazılır. Bu şekilde file1‘in içeriğine file2 ile erişebiliriz. ln -s file1 file2 şeklinde yazılır.
lifeinbeta@lifeinbeta:~/Desktop$ touch file1
lifeinbeta@lifeinbeta:~/Desktop$ vim file1
lifeinbeta@lifeinbeta:~/Desktop$ cat file1
lifeinbeta@lifeinbeta:~/Desktop$ ln -s file1 file2
lifeinbeta@lifeinbeta:~/Desktop$ ls -F
lifeinbeta@lifeinbeta:~/Desktop$ cat file2
Görüldüğü gibi, sembolik link @ işareti ile belirtiliyor. Hard Link‘te olduğu gibi, link edilmiş olan dosyanın içeriğini değiştirdiğimizde gerçek dosyanın içeriği de değiştirilmiş olur.
UNIX’te bir dosya sistemi hiyerarşisi, birden fazla disk ya da disk bölümü üzerindeki dosya sistemlerinden oluşabilir. Her dosya sistemi, kendisinden sorumludur, diğer dosya sistemleri hakkında bilgiye sahip değildir.
Hard Link‘ler, bir dosya sisteminin kendi veri yapısı olan bir i-node ile ilişkili olduğu için, sadece kendi dosya sistemi hakkında bilgiye sahiptir. Bu nedenle, bir dosya sistemindeki bir dosyadan, başka bir dosya sistemindeki bir dosya için oluşturulamaz.
Soft linkler ise dosya ismini içerdiği için bu durumdan etkilenmez. freeglut için aynı dosya sistemi içinde çalışacağımdan aslında Hard Link de oluşturabilirdim.
May 17, 2011 · 21:18
lifeinbeta@lifeinbeta:~/CSWORKS/C$ cat dummy1.c dummy2.c >> dummy_rm.c