Hep chmod
kullanarak, çalıştırmadan önce, Terminal kabuğundan yapabilirsiniz:
chmod a+x my_script.sh
Eğer Python yapmak istiyorsanız, os
modülünde chmod
veya fchmod
birini kullanabilirsiniz. Zaten dosyasının açık var, ben ikinci yapardım:
with open("my_script.sh", "w") as fd:
fd.write("#!/bin/sh\n")
fd.write("echo $PATH\n")
os.fchmod(fd.fileno(), stat.S_IRWXU | stat.S_IRWXG | stat.S_IROTH | stat.S_IXOTH)
Maalesef gördüğünüz gibi, başka her şeyi yalnız bırakarak herkes için x
işaretini ekleyerek chmod a+x
için doğrudan bir eşdeğer yoktur. Ama chmod
komut satırı aracı aslında yaptığı aynı şeyi yapabilir: stat
dosyası (bu durumda, ya, fstat
) mevcut izinleri almak için, sonra bunları değiştirin:
with open("my_script.sh", "w") as fd:
fd.write("#!/bin/sh\n")
fd.write("echo $PATH\n")
mode = os.fstat(fd.fileno()).st_mode
mode |= stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH
os.fchmod(fd.fileno(), stat.S_IMODE(mode))
(Değilsin Aslında çoğu platformda S_IMODE
adımına gereksinim duyuyoruz, çünkü ya st_mode
hiçbir ekstra bit'e sahip değil veya (f) chmod
, OS X'in yaptığı gibi, zararsız bir şekilde göz ardı ediyor. Ancak, kodunuzu taşınabilir ve gelecekteki yapmak için doğru olanı yapmak daha iyidir - geçirmez.)
Çoğu kişi, "dost" isimlerini S_IXUSR
gibi özellikle arkadaş canlısı olmamayı (Aynı
with open("my_script.sh", "w") as fd:
fd.write("#!/bin/sh\n")
fd.write("echo $PATH\n")
mode = os.fstat(fd.fileno()).st_mode
mode |= 0o111
os.fchmod(fd.fileno(), mode & 0o7777)
111
kullanıcı, grup ve diğeri tarafından yürütülebilir şu anlama gelir: Eğer sekizlik açısından modların düşünmeyi öğrenmek kez ve POSIX şeyleri abbreviates nasıl hatırlamaya çalışarak daha doğrusu kolay, bu yüzden bu tercih edebilirsiniz |
(ST_IX*
bit'in çeşitli) ve 7777
gibi bir şey, (f) chmod
(S_IMODE
'un yaptığıyla aynı) geçişine izin verdiğiniz bitlerdir.
Dosyaya uygun izinleri ayarlamak için alt işlemi kullanın - http://docs.python.org/2/library/subprocess.html – theharshest
@theharshest: Bunu alt işlemlerle nasıl yaparsınız? (Bunun yerine, check_call (['chmod', 'a + x', 'myscript.sh']) 'komutunu kullanabildiğinizi farz edersiniz, bunun yerine, check_call (['echo', 'foo'])' dır. print ('foo') 'eğer gerçekten istiyorsan, ama… neden?) – abarnert