/usr/bin altındaki uygulama başlatıcı dosyaları oluşturma sistemi

Başlatan edge35, 29 Temmuz 2017 - 01:14:40

« önceki - sonraki »

0 Üyeler ve 2 Ziyaretçi konuyu incelemekte.

edge35

Basit bir uygulama hazırlıyorum. Uygulamanın "/usr/bin" altına atılacak olan başlatıcı dosyayı nasıl, hangi sistematik yapıyla oluşturacağımı bilmiyorum. Bahsettiğim dosya, bir program kurduğumuz zaman terminal aracılığıyla uygulamayı çalıştırmamıza yarayan dosyalar (yani /usr/bin altına atılan dosyalar).

Bu dosyaların özel bir adı var mı? Eğer varsa bilmediğim için araştırma da yapamadım. Bu dosyaların nasıl oluşturulduğunu nereden öğrenebilirim?

Yardımcı olabilirseniz sevinirim.


Sorunlarımı çözerken her şeyiyle öğrenmeye çalışıyorum. Bana balık verenden Allah razı olsun, ama bana balık tutmayı öğretenden Allah daha çok razı olsun :)

edge35



Sorunlarımı çözerken her şeyiyle öğrenmeye çalışıyorum. Bana balık verenden Allah razı olsun, ama bana balık tutmayı öğretenden Allah daha çok razı olsun :)

illedelinux

@edge35 yazılımcı değilim ancak /usr/bin içine herhangi bir sh veya python dosyası atıyorum onu başlangıçta veya uçbirimde çalıştırıyorum.
Ben thunar kullandığım için sağ tık >izinler sekmesinden  "Bu dosyanın bir program olarak çalıştır" tikini işaretliyorum ve o dosyaya ne programlanmış ise o şekilde çalışıyor, bu konuda başka da bilgim yok...
GNU/Linux kullanmıyorum, onu yaşıyorum...

edge35

[mention=629390]@illedelinux[/mention] teşekkür ederim. Benim merak ettiğim bir uygulamaya ek seçenekler (örneğin "ls -l","ls-a","ls-al" gibi). Galiba bunlar için o dosya bash ile yazılıyor. Ama Makefile kullanımı gibi bir anlatım olsa çok işime yarardı. Yine de tekrar teşekkür ederim.


Sorunlarımı çözerken her şeyiyle öğrenmeye çalışıyorum. Bana balık verenden Allah razı olsun, ama bana balık tutmayı öğretenden Allah daha çok razı olsun :)

siberoloji

[mention=629391]@edge35[/mention]

nano otomatikornek.sh
komutu ile bir betik dosyası oluşturalım. Açılan dosyaya, aşağıdaki Script kodlarını yapıştıralım.

#!/bin/bash

# Basitin biraz ötesinde değişken örneği
# siberoloji 11/05/2016
# Bash betiklerinde, gönderilen argümanlar $1,$2,$3 şeklinde tutulur ve işlenirler.
# $# - Scripte dışarıdan gönderilen toplam argüman sayısı bu değişkende tutulur.
# $* - Scripte dışarıdan gönderilen argümanların tamamı anlamına gelir.
# $0 – Scriptin adı bu değişkende tutulur.

clear

echo Ben: Benim adım $0 ve ben komut satırından toplam $# argüman gönderdim.

echo Bilgisayar: Evet, gönderdikleriniz bunlardı: $*

echo Bilgisayar: Ve gönderdiğiniz 2. argüman da $2, doğru mu? :\)


Dosyayı kaydedip çıkalım. Aşağıdaki komutla çalıştırılabilir yapalım.

chmod +x otomatikornek.sh

Aşağıdaki komutla betiğe 3 adet dış argüman gönderelim.

./otomatikornek.sh Umut Serhat Mesut


Benim adım ./otomatikornek.sh ve ben komut satırından toplam 3 argüman gönderdim.

Bilgisayar: Evet, gönderdikleriniz bunlardı: Umut Serhat Mesut

Bilgisayar: Ve gönderdiğiniz 2. argüman da Serhat , doğru mu? :)


Gönderilen argümanlar arasında Umut varsa şunu yap,
Gönderilen argümanlar arasında Serhat varsa şunu yap,
Gönderilen argümanlar arasında Mesut varsa şunu yap,
Gönderilen argümanlar arasında Umut ve Mesut varsa şunu yap,
Gönderilen argümanlar arasında Umut veya Serhat varsa şunu yap,
..... vb. bütün ihtamellere göre if veya case yapısını betik içine kodladığınızda iş daha da güzelleşir.





mhmtkrktr

Örneğini verdiğin komut ve benzerlerinin çoğunluğu C ile yazılmış ve derlenmiş dosyalar. Hangi dilde yazmışsan ona göre derler ve açarsın.
gcc, gresource, shc vb.
https://stackoverflow.com/questions/7904941/how-to-view-the-machine-language-of-a-compiled-c-file
Paketlemeden kendi bilgisayarında kullanacaksan, yukarıda söylendiği üzere dosya şeklinde /bin altına atıp kullanabilirsin.

edge35

[mention=629549]@mhmtkrktr[/mention] teşekkür ederim
Alıntı YapÖrneğini verdiğin komut ve benzerlerinin çoğunluğu C ile yazılmış ve derlenmiş dosyalar.
örneğini verdiğin komutlardan kastınız alttaki mi?
Alıntı Yap(örneğin "ls -l","ls-a","ls-al" gibi)
Eğer o ise C ile, çalışan dosya yani "ls"'den sonra "-a" komutunu nasıl algıladığını anlatabilir misiniz, ve ya kaynak da olur. Eğer C ile bunu yapmam mümkün ise daha mutlu olurum.

[mention=629537]@siberoloji[/mention] teşekkür ederim. Verdiğiniz örnek ile çalıştırılabilir dosyadan sonraki girdileri nasıl kullanacağımı görmüş oldum. Biraz kurcalayarak if-else yapısını da temel olarak öğrendim sanırsam. Fakat "ls" den sonra "-a","-l" gibi uzantıları da bu yöntem ile mi kullanıyoruz? Yoksa bunun için başka bir düzen mi var?


Sorunlarımı çözerken her şeyiyle öğrenmeye çalışıyorum. Bana balık verenden Allah razı olsun, ama bana balık tutmayı öğretenden Allah daha çok razı olsun :)

mhmtkrktr

Mutlu ol o zaman  ;)
https://gist.github.com/amitsaha/8169242

-a gibi terimler hangi fonksiyonu işleteceğini söyleyen belirteçler. Bash da bunu case ile kolayca yapabilirsin. C ile de muhtemelen benzer bir şekli vardır. O konuyu sen biliyorsun zaten.
Mantığını anlaman için kabaca aşağıda ki içeriği hazırladım. İçeriği /bin altında uzantı olmaksızın lsem adında bir dosyaya yaz. Ardından çalıştırma yetkisi verirsin ve aynı ls komutunu kullanır gibi deneyebilirsin.

lsem
lsem /deneme
lsem -l
lsem -l /deneme
lsem *a
lsem -a
lsem -a /deneme
lsem -h

gibi.

#!/bin/bash

#  Açıklama *******************************************************************
# $1 - $2 - $3 = ana komuttan sonra yazılmış terimlerin sırasıyla değerlerini belirtir.
# örn: ls -l /usr/bin için;
# $0 = ls
# $1 = -l
# $2 = /usr/bin anlamına gelecektir. **************************

########## + 1. aşama ***************************************

# komuttan sonra ikinci bir terim yani dosya yolu verilmişmi kontrol ediyoruz. Yolun doğruluğu ile burada ilgilenmiyoruz.
# eğer $2 varsa, o zaman $1 de vardır ama biz ona 2. aşamada daha detaylı bakacağız.
if [[ ! -z $2 ]]; then
# evet. dosya yolu verilmiş. seçim adında ortak bir değişken oluşturuyoruz ve değerinin dosya yolu olduğunu belirtiyoruz.
secim=$2
else
# hayır. dosya yolu verilmemiş. O zaman komut bulunduğumuz dizin için çalışsın. Seçim değişkenimiz pwd çıktısı olacak.
secim=`pwd`
fi
# -1 ****************************************************


########## + 4. aşama ****************************

# Seçenekleri belirleyerek artık buraya kadar geldik.
# Burada seçeneğe uygun olan işleme dair ne isteniyorsa onu yapıyoruz
# örneğin '-l' değeri istenmişse stat komutunun yardımı ile istenen (secim değişkeni) bölümün yetki durumu sahibi vs. gibi durumlarını alıp listeliyoruz.
# Hangi dille yazılırsa yazılsın, kullanılacak tüm komutlar iç içedir. Örnekte olduğu gibi, ls -l nin çalışabilmesi için stat ın da olması ve düzgün çalışıyor olması gerekir.
# Herşeyden bağımsız olması için, bunu yapacak işlevinde (stat) tekrardan yazılması ve bu kodlara ilave edilmesi gerekir.
# Bu sebeple benzer kodların, mümkün olduğunca linux ve util-linux tarafından sağlanan ana işlevlerin kendileriyle yapılması bir çok açıdan kolaylık sağlayacaktır. 

FuncLsHelp() {
echo -e '\n
Kullanım: lsem [SEÇENEK]... [DOSYA]...\n
-a --all nokta ile başlayan girdileri yoksayma\n
-l uzun listeleme biçimi kullan\n
-h --help yardım menüsünü göster
'
}
FuncLsView() {
echo " $1 için liste oluşturuldu"
}
FuncLsList() {
echo "yetki durumları, $secim için liste oluşturuldu"
}
FuncLsAll() {
echo "gizli dosyalar,  $secim için liste oluşturuldu"
}
# - 4 ******************************************************


########## + 3. aşama ******************************

# 2. kontrol aşamasında komuta verilen ilk parametrenin '-' ile başladığını doğrulamış ve süreci buraya yönlendirmiştik.
# burada '-' den sonraki değerin ne olduğuna bakıp, süreci ona uygun işlemin yapılacağı üst fonksiyona gönderiyoruz.

FuncMainFunction() {
while [[ -n $1 ]]; do
    case $1 in
-l) # komuttan sonraki ilk değer -l şeklinde verilmiş
# çalışacak fonfsiyon buna göre FuncLsList. Diğerleride aynı şekilde devam.
FuncLsList ;;
-a|--all ) FuncLsAll ;;
-h|--help ) FuncLsHelp ;;
*) # ilk değer '-' ile başlıyor fakat ilk değerin ikinci karakteri burada ki hiçbir seçeneğe uymuyor
echo -e "\nlsem : hatalı seçenek $1\ndaha fazla bilgi için\
'lsem --help' kullanın"
    esac
  shift
done
}
# -3 **************************************************************


########### +2. aşama *************************************

# $1 yani komuta ilave bir değer verilmişmi ona bakıyoruz.
# $1 olarak dosya yoluda verilmiş olabilir. Bunu ayırabilmek için koşullara bakarak süzgeçten geçiriyoruz.

# eğer değerin ilk karakteri '-' şeklinde başlıyorsa
if [[ "${1:0:1}" = "-" ]]; then
# evet - ile başlıyor. O zaman parametreleri tanımlayan fonksiyona atlıyoruz
# ve komutun parametreye uygun hangi fonksiyonla çalıştıracağını ona bırakıyoruz. Yani süreci FuncMainFunction 'a bırakıyoruz.
  FuncMainFunction $1
 
# eğer değerin ilk karakteri '/' şeklinde başlıyorsa
    elif [[ "${1:0:1}" = "/"  ]]; then
      # evet / ile başlıyor. O zaman değer olarak parametre olmaksızın dosya yolu verilmiş.
      # Bu durumda  FuncMainFunction a ihtiyacımız yok. Doğrudan FuncLsView ile verilen yolun doğruluğuna veya dizin ise içerik listesine bakabiliriz.
  FuncLsView $1
 
# eğer değerin ilk karakteri boş ise, yani komuta ilave hiçbir değer verilmemişse  
    elif [[ ! -n "${1}"  ]]; then
      # evet boş bırakılmış. O zaman komutu FuncLsView fonksiyonu ile çalıştırıyoruz. Fakat farklı olarak yol belirtilmediği için, hangi dizin için çalışacağını kendisine bırakıyoruz. Mantık bulunduğumuz dizin diyor. Bu da pwd komutunun değeri oluyor.   
  FuncLsView `pwd`
 
# eğer komuta bir değer veya yol verilmiş fakat değerin ilk karakteri yukarıda ki koşulların hiçbirisine uymuyorsa  
    else
    # evet uymuyor. o zaman bu işte bir yanlış var.
echo -e "\n lsem : '$1' e erişilemedi. Böyle bir dosya yada dizin yok."
fi
# -2 ***********************************************************


FuncLs** = fonksiyonların içerisinde aslında ne yapacağın sana kalmış.

edge35

[mention=629559]@mhmtkrktr[/mention] teşekkür ederim, biraz daha iyi anladım şimdi.


Sorunlarımı çözerken her şeyiyle öğrenmeye çalışıyorum. Bana balık verenden Allah razı olsun, ama bana balık tutmayı öğretenden Allah daha çok razı olsun :)

mhmtkrktr

Örneği oluştururken fazla zamanım yoktu. Kabuk diline yabancı olanlar için açıklama ekledim.
Dört aşama sırası ile takip edilirse, daha kolay anlaşılır sanıyorum. Fakat belirtmekte fayda var, normalde bu işlem biraz daha farklı yapılabilir ve daha fonksiyonel hâle gelebilir. Anlaşılması kolay olsun diye en sâde yoldan gitmeye çalıştım.
Aklına takılan yer olursa sorabilirsin yine. Anladığım bir konu ise dilim döndüğünce, bildiğim kadarıyla açıklamaya çalışırım.

edge35

[mention=629576]@mhmtkrktr[/mention] teşekkür ederim, eğee bir sorunum olursa tekrar rahatsız ederim :)


Sorunlarımı çözerken her şeyiyle öğrenmeye çalışıyorum. Bana balık verenden Allah razı olsun, ama bana balık tutmayı öğretenden Allah daha çok razı olsun :)