Komut dosyalarını çalıştırmak için neden .sh dosyası yerine .txt dosyasını yürütülebilir yapmıyorsunuz?


18

.shTek bir komut dosyası yapmak için bir dosyanın içine yürütülebilir komutlar koymanın gerekliliğini merak ediyordum , çünkü komutları bir .txtdosyanın içine koyarak ve bunu yürütülebilir hale getirerek aynı şeyi yapabilirim chmod.

Bunun herhangi bir dosya uzantısıyla yapılabileceğini varsayıyorum. Yani, .shuzatma ihtiyacı konusunda oldukça kafam karıştı . Herhangi bir yardım çok takdir edilecektir.


19
Unix geleneksel olarak dosya uzantılarını önemsemez. Yani haklısın - önemli değil. Sadece okuyucunun bir kabuk komut dosyası olduğunu açıkça göstermek
vidarlo

8
Linux dosya uzantıları işletim sistemi tarafından gerçek bir şekilde kullanılmaz. Bir .sh uzantısı koymak, kullanıcıya sadece bir python veya perl betiği gibi başka bir dosya türünün aksine bir kabuk komut dosyası olduğunu söyler. Şahsen ben senaryolarıma uzantı koymuyorum.
doneal24

2
Sadece size veya ona bakan herkese bunun bir kabuk komut dosyası olduğunu söylemek gerekir. Hangi .txt dosyalarının çalıştırılacağını ve hangilerinin bir düzenleyicide açılacağını söylemeyi umursamıyorsanız, her şeyi .txt olarak adlandırmaktan çekinmeyin!
daboross

2
Right.txt, ancak.txt if.txt everything.txt ends.txt ile.txt the.txt .txt.txt suffix.txt, siz txt değilsiniz. .txt) anlayış.txt her.txt dosyası.txt nedir ..txt orada.txt for.txt.
leftaroundabout

1
Bu, bunun varsayılan bir kopya olduğu sorusuna benzer , ancak bu soru aslında buna cevap vermiyor.
Kenny Evitt

Yanıtlar:


47

Doğru bulduğunuz gibi dosya uzantısının belirli bir şeyle eşleşmesine gerek yoktur.

Unix benzeri sistemlerde, dosya türleri adlarından değil, genellikle dosyanın içeriğinden (yani "sihirli sayı" veya ilk birkaç bayttaki diğer karakteristik yapılar) türetilir. Ayrıca, genellikle yürütülebilir dosyalar için yapılan uzantıyı tamamen atlayabilirsiniz.

fileKomutu kontrol edin, içeriğinden bir dosya türü hakkında bulabileceği bilgileri gösterir.

Yürütülebilir bir komut dosyası için, sistem ilk satırda sözde bir "shebang" bekler.

#!/usr/bin/env python3

ve hangi programın kod dosyasıyla argüman olarak çalıştırılacağını belirtir. Böyle bir şey olmadan bir metin dosyası yürütürseniz, varsayılan kabuğunuzu, yani Bash'i denemek ve yorumlamak için kullanır.

Bu nedenle Unix / Linux sistemlerinde, dosya adı uzantıları genellikle insan kullanıcının belirli bir dosyanın neyi içermesini beklediğini hızlı bir şekilde tanıması için bir ipucudur (ancak garanti yoktur). Aynı zamanda, örneğin dosyaları daha hızlı bulmanıza yardımcı olabilecek bir kuraldır.

Bununla birlikte, ad ve uzantının önemli olduğu bazı istisnalar olduğunu unutmayın (örneğin, bir adlandırma kuralına uyması gereken bazı sistem yapılandırma dosyaları veya birçok resim görüntüleyici ve düzenleyici, dosya türünü belirtmek için uzantıya ihtiyaç duyar).

Ayrıca, dosya uzantılarının herhangi bir amacı var mı (işletim sistemi için)?


3
Dosya uzantıları bir kabukta önemli değildir, ancak GUI OS'lerin dünyasında, çift tıklamanın doğru çalışmasını sağlamak için hemen hemen onlara ihtiyacınız vardır.
BallpointBen

@BallpointBen iki nokta ilgisiz. GUI altında bile bir dosyanın "türü", bir meta veri olarak depolanabilir ve uzantıya bakılmaksızın belirli bir yürütmeyi tetikleyebilir. MacOS dosya adı uzantılarına sahip değildir ve bir
GUI'dir

1
@PatrickMevzek, MacOS'un uzantıları nasıl yok? Onları göstermeyi etkinleştirdim ve tüm dosyalarda var. Bir şey mi kaçırıyorum? MacOS platformunda
yeniyim

1
@ CiprianTomoiagă dosyalarınızı istediğiniz gibi adlandırabilirsiniz, işletim sistemi üzerinde düzgün çalışması için uzantıya ihtiyaç duymaz. Örneğin bakınız: howtogeek.com/192628/…
Patrick Mevzek

1
@barbecue en düşük ortak paydayı hedefliyor ... bununla neyin yanlış gidebileceğini :-) (e-posta ekli dosyalar yoluyla something.com.txt adlı saldırılar ve .txt dosyasını Windows-land'da belirli bir anlam olarak .com olarak atlamak için hile yapmak gibi ). Aslında, birlikte çalışabilirlik için dosya uzantıları iyi bir uygulama olabilir. Biri bunun DOS tarafından temelde açıkça ortaya konan bir kusur olduğunu ve çeşitli işletim sistemlerinin uzantılar olmadan dosyalarla mükemmel bir şekilde yaşadığını öğrenmelidir.
Patrick Mevzek

3

UNIX / Linux dosya adında "uzantı" veya "tür" dosyası diye bir şey yoktur.

Diğerlerinin de belirttiği gibi, "type", ilgili büyünün sisteminizde mevcut olduğu varsayılarak file komutu kullanılarak bulunabilir. UNIX / Linux dosya adları normalde kullanılabilir herhangi bir karakter içerebilir, ancak hem insanlar hem de makinelerin içerik (ve dolayısıyla içeriğin kullanımı) hakkında karar verebilmesi için ad için bir tür kural kullanmak genellikle yararlıdır.

Örnek olarak, dosya adının sonunda ".tmp" gibi bir şey kullanmak yerine, geçici bir dosyayı belirtmek için dosya adının ilk karakteri olarak virgül kullanırım. Sonuç aynıdır, yalnızca kısa bir süre için gerekli olan verileri içeren bir dosyadır ancak adın "." ne de "tmp" dizesi içinde. Bunun, bazen dosya adlarının bir listesini ayrıştırırken avantajları olabilir. Ama bu benim konvansiyonumdur ve bir başkası geçici dosya için bir isim konvansiyonu olarak ".tmp" yi kullanmaya karar verebilir.

Bu yüzden size cevabım, UNIX / Linux dosya uzantısı gibi bir şey olmadığı için, genellikle diğer işletim sistemlerinde ve dosya sistemlerinde kullanılan dosya uzantılarına benzeyen bir dizi kural vardır.


FWIW, kendim için standart olmayan bir sözleşme de kullanıyorum. Adları ile başlayan komut dosyalarım "."kabuk tarafından işaretlenmelidir (bir alt kabukta anlamlı olarak çalışamazlar). Buna karşılık olarak, ls"gizli" olanlar da dahil olmak üzere tüm dosyaları görebilmem için kullanılan takma adlar / komut dosyalarında varsayılan "ilk dot = gizli dosya" kuralını devre dışı bırakıyorum. Benzer şekilde Windows'ta da "dosya uzantılarını gizle" ayarını devre dışı bırakıyorum.
jrw32982 Monica
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.