Code qui ne sera exécuté qu'une fois


223

Objectif

Le but de ce défi est d’écrire du code qui ne s’exécutera qu’une fois. Cela signifie fondamentalement que cela endommage le programme, le script ou l'environnement d'une manière ou d'une autre. Si le redémarrage du système permet au code de s'exécuter à nouveau, cela est autorisé.

Notation

Nombre de voix Toutes les hypothèses doivent être clairement énumérées. Toute réponse qui déclenche un redémarrage ou une interruption sera disqualifiée.

Règles additionnelles parce que Greg Hewgill est un demi-dieu

Aucun accès root n'est autorisé.

Date de fin

Le concours se terminera le 31 mai 2014.

Modifier

Ce concours a été changé en concours de popularité.


7
@PeterTaylor pourrait être une solution mais le résultat montre que ce n'est pas le seul.
Lukei

101
Pour un grand nombre de personnes appelant vidans un environnement de terminal unique, cet effet est impossible, sauf si vous redémarrez :) Juste une blague ici.
orion

6
Le site est gratuit pour vous permettre de proposer une telle question.
Ojblass

16
echo "If you try to execute me again, it means you are an idiot.";<- Personne ne va exécuter plus d'une fois: P
user3459110

25
Les logiciels liés aux missiles seraient-ils qualifiés? ;)
résumé le

Réponses:


518

Veillée

Enfin un cas d'utilisation pour Vigil!

def main():
  raise Exception()

Extrait de la "spécification du langage":

Il va sans dire que toute fonction qui lève une exception non capturée est fausse et doit être punie.

...

Si un serment est brisé, la fonction fautive [...] sera dûment punie.

Comment?

Simple: il sera supprimé de votre code source.

La seule façon de s’assurer que votre programme répond à ses exigences est d’interdire absolument tout code qui échoue. Avec Vigil, cela se fera automatiquement pour vous .

Il existe d'autres moyens de le faire, car Vigil fournit les mots-clés imploreet swearconstitue essentiellement le serment de respecter certaines conditions préalables et postérieures:

def main():
  swear 0 > 1

116
Cela mérite sans aucun doute de gagner.
Matteo Italia

77
Enfin, un langage suffisamment vigilant pour l’ère moderne! Je vais commencer à l'utiliser en production. Tous les bugs doivent être purgés.
Claudiu

13
Pour moi, il semble que ce ne soit pas nécessairement la faute de la fonction qui lève une exception non capturée, il se peut également que les fonctions de la pile d'appels soient négligentes parce qu'elles ne l'ont pas interceptée. Cela pourrait même suggérer que l'architecture de l'ensemble de l'application est défectueuse (car il n'y a peut-être aucun moyen de gérer correctement cette exception sans restructurer le code?) En bref, l'ensemble du programme devrait être supprimé.
Jonathan Pullano


32
Des points supplémentaires pour jurer. Un programme qui fait une fausse déclaration confiante doit sans aucun doute être éliminé.
orion

293

Pratiquement toutes les distributions Linux, 9 caractères

Celui-ci est un classique!

#!/bin/rm

Mettez ceci dans un fichier et lancez-le:

> ed
a
#!/bin/rm
.
wq foo
> ls
Mail mbox foo
> chmod 777 foo
> ./foo
> ls
Mail mbox

Aaand c'est parti!

Quant à ce qui se passe: je cours vraiment rm! #!s'appelle un shebang . Et si vous mettez l'un de ceux-ci suivi d'un chemin d'accès à un exécutable comme première ligne de votre script, le programme chargera votre fichier de script avec tout ce que vous avez écrit - la valeur par défaut est habituellement #!/bin/bashou #!/bin/sh(shell Bourne-again / Bourne) . Le premier argument transmis à ce script sera le nom du fichier lui-même (c'est pourquoi vous voyez tant de solutions, y compris %0ou $0et j'aime dans ce domaine); Ainsi, en faisant en sorte que mon fichier soit contenu #!/bin/rmet en l'exécutant, je ne fais que transmettre le nom de fichier de mon fichier rm.


9
Sans jamais avoir utilisé Linux moi-même, je pense que cela supprime le fichier script.
urous

56
@NateKerkhofs la #!séquence commence un shebang, qui identifie quel interprète vous allez utiliser pour le script - normalement /bin/bash. Ici, Flonk a utilisé /bin/rmcomme "interprète". rmest un programme qui supprime des fichiers. Parce que Linux pense que nous voulons rmêtre un interprète, il lui passe le nom du fichier comme argument. par conséquent, le fichier se supprime lui

19
C'est hystérique
ojblass

25
@ user80551 Je n'ai pas besoin d'un accès root pour cela.
Flonk

9
hmm ..../foo mbox
Izkata

241

binaire x86, 4 octets

F0 0F C7 C8

Hypothèse: doit être exécuté sur un processeur P5 Pentium.

L'instruction ci-dessus est communément appelée le bogue F00F . Il tente d'exécuter une instruction non valide, préfixée par lock .

Cela gèle complètement le processeur (pas d'arrêt ni de redémarrage) et ne nécessite même pas d'accès root.


4
Wow ... c'est vraiment intéressant.
Ojblass

31
@JackM: Ce sera le cas, mais c'est explicitement autorisé dans la question.
Dennis

34
@JackM, cela semble être un excellent moyen d'empêcher l'exécution du "script".
Paul Draper

5
Je me souviens quand ce virus faisait le tour. Une solution de contournement kernelside a été trouvée presque immédiatement - elle ne plantera pas l'ordinateur à moins d'exécuter un système d'exploitation sans le correctif.
dimanche

3
@RosLuP 209 différents utilisateurs, apparemment. Si vous n'êtes pas d'accord, votez vers le bas et avancez.
Dennis

150

Bash, 5

>"$0"

Se tronque à zéro.

Si le nom de fichier ne contient pas d'espaces, >$0fonctionne pour 3 caractères !


2
En fait, les guillemets ne sont jamais nécessaires pour une variable utilisée dans un nom de fichier de redirection comme celui-ci, même si le programme ou le chemin d'accès au programme contient des espaces, en raison d'un cas particulier dans les règles d'analyse syntaxique du shell. Donc, vous pouvez toujours le faire en 3 caractères!
apenwarr

3
@apenwarr indique "$ 0: redirection ambiguë" sans guillemets et le nom du fichier contient des espaces

1
@apenwarr, cela est nécessaire si le shell qui interprète ce script est basé sur ksh88 ou bash n'est pas en mode posix. Ce n'est pas une question d'espace, il s'agit de n'importe quel caractère de $IFSbash et de joker pour bash et ksh88. Un script de moins-que-rien sera généralement interprété par le système sh, mais certains shells, y compris bash et ksh88, les interpréteront à la place.
sch

144

gzip

#!/bin/gzip

Trop d'ennuis pour les personnes habituées aux outils de ligne de commande non destructifs, détruit gzippar défaut le fichier d'origine en le remplaçant par une version gzippée (ajout d'un suffixe).

Ceci est une variante de l' #!/bin/rmoption, sauf que celle-ci est récupérable par une intervention humaine manuelle (appelez gunzip-la). En prime, le fichier résultant est beaucoup plus long que l'original (la différence dépend de la longueur du nom du fichier).

Attention: l'emplacement de gzippeut varier.

EDIT: comme l'a souligné WChargin, c'est plus portable:

#!/usr/bin/env gzip

Le reste du fichier peut avoir n'importe quel contenu. C'est essentiellement un fichier qui, lorsqu'il est appelé, se cache dans une boîte et refuse de sortir jusqu'à ce que vous le décompressiez de force.


7
Je n'y avais jamais pensé auparavant, mais vous avez absolument raison.
ojblass

très intéressant
Grijesh Chauhan

11
"Attention: l'emplacement de gzippeut varier" - ce n'est pas du code-golf , vous pouvez donc l'utiliser#!/usr/bin/env gzip
wchargin

37
+1 juste pour It's essentially a file that, when called, hides itself in a box and refuses to come out until you forcibly unpack it.You made my day, et il est 1h du matin.
applaudir le

Il s'agit essentiellement d'un fichier qui, lorsqu'il est appelé, se cache dans une boîte et refuse de sortir jusqu'à ce que vous le décompressiez de force. m'a fait rire. : D
Mischa

121

Bash, 13 12

Pas le plus court, mais il ne supprime pas le fichier et ne rend pas le système inutilisable.

chmod 0 "$0"

Si le nom de fichier ne contient pas d'espaces, vous pouvez supprimer les guillemets pour enregistrer 2 caractères.

Explication

Il supprime toutes les autorisations ( rwx) de lui-même. Lorsque vous essayez de l'exécuter, ou même d'afficher son code, une seconde fois, sans restaurer manuellement les autorisations, il affichera quelque chose comme:

bash: <FILENAME>: Permission denied

Restaurez les autorisations avec

chmod +rwx <FILENAME>

Ancienne version

Supprime seulement les permissions d'exécution, mais un caractère plus long (c'était une question de avant qu'elle ne soit modifiée en ):

chmod -x "$0"

Version sournoise de Łukasz Niemier

#!/bin/chmod 0

4
chmod 0travaille aussi
gnibbler

@gnibbler thnx, ajouté

Je pense que vous pouvez appeler le programme aet économiser encore 3 caractères:chmod 0 a
le

@tohecz c'est tricher mais

5
Encore plus agréable#!/bin/chmod 0
Hauleth

112

Code machine 6800 - 1 octet

0xDD

Ceci est connu comme HCF ou Halt and Catch Fire


78
Eh bien, les règles disent "Toute réponse qui initie juste un redémarrage ou un arrêt sera disqualifiée", mais cela ne déclenche pas simplement un arrêt, car cela prend également feu. Ainsi, +1!
Trejkaz

94

Shell + sed, 16 octets

Pas aussi destructeur que certaines des autres réponses ;-)

Ce script insère un commentaire #au début de chaque ligne:

sed -i s/^/#/ $0

3
Que diriez- sed -i g $0vous
Seshoumara

91

Commodore 64 BASIC

Celui-ci ne supprime pas le programme.

1 POKE 2048,1

Auto-destruction

Selon la mappe de mémoire du Commodore 64 , l'adresse 2048est inutilisée, mais elle doit contenir une valeur 0telle que le programme BASIC puisse être exécuté.


1
Poke déplace-t-il simplement une variable vers un emplacement?
Ojblass

12
@ ojblass oui, efficacement. poke a, best équivalent au code C *((unsigned char *)a) = b;.
Jules

4
Je voudrais visualiser mes pokes FaceBook de cette façon!
Sunny R Gupta

3
Oh wow ... je me souviens de PEEK et POKE de C64 BASIC!
J'écrivais

note de côté: un 0octet est utilisé pour marquer la fin des lignes de code; donc l'adresse 0x800 en a probablement besoin pour marquer le début de la première ligne de code.
Titus

89

Hypothèse: exécuter Solaris, connecté en tant que root

killall

3
Solaris a-t-il vraiment une telle chose?
ojblass

21
Oui, il fait exactement ce qui est écrit et tue tous les processus en cours.
Greg Hewgill

un vote positif pour vous!
Ojblass

9
1, la question mentionne qu'aucun accès root n'est autorisé.
user80551

119
@ user80551 il est la raison de cette règle.
Seiyria

68

Python, 18 ans

open(__file__,'w')

Tronque le fichier en l'ouvrant en mode écriture seule.


14
Juste au cas où vous seriez sérieux, il s’ouvre tout seul ( __file__fait référence à son propre nom de fichier). L'ouverture en wmode tronque le fichier, le supprime fondamentalement.
Bob

7
Je pense que la troncature a lieu à l’ouverture, mais quel que soit le runtime Python, il devrait vider tous les fichiers ouverts à la fin du programme, et Python ou le système d’exploitation les fermera à la fin du processus. Bien sûr, il est généralement bon de fermer explicitement les poignées ouvertes lorsque vous avez terminé.
Bob

5
La "bonne" façon de gérer les fichiers en Python est avec ... er, avec. with open("myfile.txt","r") as thefile:et ensuite votre code de gestion de fichier fermera automatiquement le fichier lorsque vous aurez terminé.
Schilcote

1
Cela pourrait être réduit à quelque chose comme open("f.py","w").
Ethan Bierlein

1
Ne pas cesser de travailler tant que .pyc reste
minmaxavg

66

Lot: 5 octets

%0|%0

C'est fondamentalement le forkbomb pour Windows.

L'application commence son premier argument deux fois. Ne l'exécutez pas dans un environnement productif;)


83
Existe-t-il un environnement Windows productif? (Je plaisante bien sûr).
orion

17
ça a l'air si innocent!
Ojblass

15
Ok, certainement n'essaye pas ça. Ça ne s'est pas bien passé.
Rmobis

75
Vous n'avez pas le représentant à voter, mais cela viole "ne fonctionne qu'une fois" de la manière la plus sévère possible.
Xan

14
Je crois qu'un humain ne l'exécute qu'une fois et qu'il est admissible.
Ojblass

54

JavaScript

localStorage.x = eval(localStorage.x + localStorage.x)

La première fois que vous l'exécutez, tout se passera bien:

>>> localStorage.x = eval(localStorage.x + localStorage.x)
NaN

Si vous essayez de l'exécuter davantage (même si vous actualisez), vous obtiendrez une erreur:

>>> localStorage.x = eval(localStorage.x + localStorage.x)
ReferenceError: NaNNaN is not defined

5
Donc, si vous le lancez souvent, vous obtenez le thème Batman. +1 pour cela.
Hankrecords

2
@Hankrecords Malheureusement, pas vraiment, car cela ne sera pas exécuté plus tard ...
RedClover

@ Soou Bummer ...
Hankrecords le

@Hankrecords sauf si vous supprimez eval, mais il ne remplira pas ce défi
RedClover

46

Le système d'exploitation CMS d'IBM, qui est un système d'exploitation mono-utilisateur qui s'exécute en tant qu'invité sous le VM Hypervisor d'IBM, possède une structure de fichier intéressante.

Les fichiers se composent de trois éléments: nom de fichier, type de fichier et mode de fichier. Le mode de fichier est constitué de deux éléments, un seul alphabétique, qui, pour faciliter l’explication, peut être considéré de la même manière que la lettre de lecteur pour Windows / MS-DOS, ainsi qu’un seul chiffre.

Le chiffre numérique unique a une signification, http://publib.boulder.ibm.com/infocenter/zvm/v5r4/index.jsp?topic=/com.ibm.zvm.v54.dmsa3/hcsd0b10127.htm , et pour cette tâche c'est le chiffre 3 qui est intéressant:

Numéro de
mode de fichier 3 Le numéro de mode de fichier 3 signifie que les fichiers sont effacés après leur lecture. Vous pouvez utiliser le mode de fichier numéro 3 si vous ne souhaitez pas conserver de copies sur vos minidisques ou dans vos répertoires SFS.

Passez donc des heures à rédiger votre script et à le classer sous «LOST FOREVER A3». Exécutez-le, cela fonctionne la première fois. Partis à la maison, travail bien fait.

Remarque, aucun message indiquant l’effacement n’est produit. Après tout, tout le monde sait ce que cela 3signifie, n'est-ce pas?

C’est bien sûr très utile. Une fois les tests terminés, vous pouvez utiliser le 3pour les fichiers temporaires sans avoir à nettoyer, car ce sont des fichiers à lecture unique.


44

Commodore 64 BASIC

0 NEW

NEW supprime le programme.


1
Qu'est ce que c'est?
Dark Egregious

3
@ user973810 si je me souviens de base, nouveau est pour le nettoyage de la mémoire, il va donc supprimer le programme
user902383

3
Agréable. Non spécifique à Commodore 64, fonctionne probablement tel quel sur presque toutes les machines BASIC 8 bits des années 80 ...
jeudi

Vous pouvez aussi utiliser OLD ou O. back. J'ai découvert 12 mois de génie du codage de jeu pour les 12 ans; p fonctionne une fois par accident. Puis sauvé accidentellement au lieu de vieux. O. ne fonctionnait plus :( J'ai appris comment les éditeurs hexagonaux travaillaient assez bien. :)
Matt Warren

3
@ SYSAP: Ce serait plus portable s'il utilisait 1 comme numéro de ligne; toutes les implémentations BASIC ne
prennent

41

Bash, 12

Note: Ceci est destructif.

:(){ :|:&};:

C'est la populaire bombe à la fourche. Il consomme de manière exponentielle toute la mémoire et les PID bloquant le système. Un redémarrage brutal permettra de réexécuter le code, mais pourquoi voudriez-vous le faire?


Bash, 10

:(){ :&};:

Pour deux caractères en moins, cela consomme votre mémoire linéairement.


Bash, 7

w;PATH=

w est choisi comme l'exécutable le plus court auquel je pouvais penser.

Cela efface simplement la variable de chemin afin que le shell ne puisse pas trouver /usr/bin/wla prochaine fois. Le redémarrage du shell le corrige car le chemin est généralement stocké dans~/.profile


Darn it: DI vient d'avoir la même idée: P
Knerd

1
:(){ :&};:ne devrait pas manger votre mémoire. Il s’arrête dès que la fourche est lancée, ce qui fait qu’il n’ya que de l’ O(1)activité. Vous avez fait while(fork());, ce qui mangerait votre mémoire linéairement équivaut à fork(); while(1);.
marinus

26
Hou la la! Ce sont des émoticions mortelles! Je ferais mieux de ne pas appeler mon ordinateur bown frownyface :(){ ....
Level River St

1
Si je me souviens bien ... la bombe fourchette laisse périodiquement un PID ouvert. Le script peut être exécuté à nouveau dans cet intervalle ... et si cela ne compte pas, il est possible de tuer tous les forks avec un peu d'effort. Le redémarrage est simplement la solution la plus simple.
Brilliand

11
Je ne pense pas que cela soit admissible. Cela n'empêche pas le script de s'exécuter à nouveau, mais garantit qu'il s'exécutera à nouveau (plusieurs fois).
Ben Voigt

20

C #

Code le plus court pour se supprimer

Process.Start(new ProcessStartInfo("cmd.exe", "/C choice /C Y /N /D Y /T 3 & Del \"" + Assembly.GetExecutingAssembly().Location + "\""));

Code pour le rendre invisible dans l'interface utilisateur

Process.Start( new ProcessStartInfo()
{
    Arguments = "/C choice /C Y /N /D Y /T 3 & Del \"" + Assembly.GetExecutingAssembly().Location+"\"",
    WindowStyle = ProcessWindowStyle.Hidden, CreateNoWindow = true, FileName = "cmd.exe"
});

7
Enfin, une réponse en C #!
Pharap

Pourquoi le choix est-il requis?
Wizzwizz4

19

C ++ 71

Le fichier exécutable "golf" se voit refuser l'autorisation de s'exécuter la prochaine fois.

#include <stdlib.h>
int main()
{
system("chmod a-x golf");
return 0;
}

JavaScript / HTML 137, 145 avec test de la console

<script id="s"> 
function h(){
console.log(1);
var s=document.getElementById("s");
h=s.innerHTML;
h=h.replace("h","g");
s.innerHTML=h;
}

11
@Templar dans le contexte de JavaScript, je pense que l'actualisation de la page compte pour un redémarrage (peut-être?)

2
Même si vous ne supprimiez pas le script de la page, il ne serait toujours exécuté qu'une fois. Cela ne sert à rien.
nderscore

2
@nderscore On dirait que la fonction h est ce qui ne sera exécuté qu'une fois. Vous devez en fait l'appeler ailleurs (comme si vous exécutiez un programme, je suppose). Dis <button onclick="h();">.
Bob

4
Étant donné que le rechargement de la page est autorisé et que votre objectif est d'empêcher que h ne soit exécutable plusieurs fois alors qu'il est déjà chargé, qu'est-ce qui ne va pas function h(){h=0}?
Keen

1
Avec #include <sys/stat.h>vous, vous pouvez accéder chmoddirectement à la fonction en économisant quelques octets ( <stdlib.h>plus nécessaire, ni plus system). En outre, non returnest nécessaire.
Ben Voigt

19

Mon nom est Shell ... PowerShell

Message classique autodestructeur:

@'
##################################
Project X is a go

Meet Eagle 1 at WP Alpha

Further comms is hereby prohibited
##################################
This message will self destruct in 
5 seconds
'@
5..1| %{$_;Sleep 1;}
"Goodbye"
rm $(.{$MyInvocation.ScriptName})

Explication, s'il vous plaît?
nozɐɹƆ

@ noɥʇʎԀʎzɐɹƆ Les lignes jusqu'à 13 ne sont que des bêtises. Après cela, comme tout autre shell, PowerShell charge le script en cours d'exécution dans la mémoire et n'a donc plus besoin du fichier de script d'origine ... il est donc supprimé.
SomeShinyObject

18

Bash (5)

rm $0

En supposant que vous n'avez pas d'espaces dans le nom du fichier.


40
C'est pourquoi Unix est meilleur que Windows: rm au lieu de vous enregistrer un octet.
MadTux

1
@MadTux, je préfère * nix à Unix.
Wizzwizz4

14

sh

#!/bin/sh
curl http://runonce.herokuapp.com/

Ne fonctionnera qu'une seule fois (et le message "Hello, world!" S’il fonctionne), même si vous réinstallez le système et remettez le script à nouveau.


EDIT: Je pensais publier un script derrière runonce également. Rien de spécial, car ce n'était pas censé être publié de toute façon, mais peu importe.

<?php
$db = pg_connect("[connection information]");
$ip = isset($_SERVER["HTTP_X_FORWARDED_FOR"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"];

pg_query("DELETE FROM users WHERE time < now() - interval '1 day'");

$result = pg_query_params($db, "SELECT * FROM users WHERE ip = $1 LIMIT 1", array($ip));

if (!pg_fetch_row($result)) {
    echo "Hello, world!\n";
    pg_query_params($db, "INSERT INTO users (ip) VALUES ($1)", array($ip));
}

Ainsi que le schéma de base de données

CREATE TABLE users (
    ip inet PRIMARY KEY,
    time timestamp with time zone NOT NULL DEFAULT now()
);
CREATE INDEX ON users (time);

Les données sont stockées dans la base de données Heroku, n'hésitez pas à consulter leur politique de confidentialité si vous le souhaitez. Je ne vérifie pas les données stockées dans une base de données, elles le sont uniquement pour permettre au code de s'exécuter une fois.


4
Je dirais que cela fonctionnera plusieurs fois, cela ne produira aucun résultat après le premier.
Brilliand

5
Cela n'a même pas une fois montré "Hello World" pour moi.
Paŭlo Ebermann

1
@ StéphaneGourichon: Oui, il se souvient des adresses IP et il n'y a aucun moyen de supprimer une adresse IP avant son retrait automatique. J'ai décidé de mettre le code source, afin que vous puissiez vérifier ce qu'il fait.
Konrad Borowski

1
@ StéphaneGourichon: pg_query_paramsprotège assez bien de l'injection SQL. Toutefois, il ne sera pas enregistré, car il '; DROP TABLE users;--ne s'agit pas d'une adresse IP valide ( inetaccepte uniquement les adresses IP). Par conséquent, si vous avez un faux en- X-Forwarded-Fortête, votre visite ne sera pas enregistrée. Je ne considère pas cela comme un problème moi-même.
Konrad Borowski

2
Je pense qu’il s’agit d’une violation d’une échappatoire standard: externaliser la vraie réponse .
juniorRubyist

12

PHP, 22 20 caractères

<?=unlink(__FILE__);

EDIT: Suppression de deux caractères à la fin par commentaires.


2
Ceci peut être encore simplifié comme: <?unlink(__FILE__);la traîne ?>n'est pas nécessaire
leepowers

Vous devez commencer avec <?=ou la balise de début n'est pas reconnue.
Michael Mior

2
PHP se détruisant ... ha! E_NOTICE line 3048
métadings

<?+ l'espace est également ok. Vous ne pouvez pas utiliser une lettre après la balise courte.
Titus

11

Ruby, 14 ans

Il réécrit le code source sous le nom du programme.

IO.write $0,$0

3
Et si le programme s'appelle "IO.write $ 0, $ 0"? "Hypothèse: nommez le programme quelque chose qui n’est pas un code valide dans aucune langue."
Brilliand

@Brill, un programme ruby ​​doit toujours se terminer par .rbet même si son nom est "IO.write $ 0, $ 0 # .rb", cela ne fonctionnera pas car lors de l'écriture, il inclura le chemin d'accès complet.
Mhmd

3
@Mhmd Un programme Ruby peut se terminer par n'importe quoi. Par exemple gemet irbsont des programmes Ruby sans extension.
bfontaine

@ bfontaine qui ont des shebangs. Cela ne veut pas.
Wizzwizz4

@ wizzwizz4 Les shebangs n'ont rien à voir avec l'extension. ruby fooet ruby foo.rbtravaillera la même chose avec ou sans shebang. ./fooet ./foo.rb(en supposant qu’ils soient exécutables) échouera sans shebang et réussira (en supposant que le code soit correct, etc.).
bfontaine

10

Lot (6 caractères)

En supposant que nous ayons la permission de supprimer le fichier, nous pouvons bien entendu le faire sous Windows (peut-être aussi MS-DOS).

del %0

10

Bash 9 8 personnages

nc -l 1&

Ne fonctionnera qu'une fois, car le port est bloqué pour toujours.


1
Je pense que cela ne fonctionne pas, car 0c'est un port spécial (c'est réservé). Lorsque je lance ceci sur mon ordinateur, je peux l'ouvrir plusieurs fois. De plus, c'est un port < 1024, ce qui signifie qu'il nécessite un accès root pour être écouté.
heinrich5991

nc -l 1&résoudrait le problème avec 0un octet plus court, car le dernier espace n’est pas nécessaire.
Kasperd

@kasperd Merci pour l'entrée :-)
Falco le

@ heinrich5991 ok - il me faudrait 11 caractères sans accès root pour utiliser un port comme 9654
Falco

Vous voulez expliquer pourquoi vous avez voté?
Falco

9

NodeJS - 33 octets

require('fs').unlink(__filename);

Pouvez-vous décrire ce que cela fait pour ceux qui ne sont pas familiers avec la langue?
Kyle Kanos

1
@KyleKanos Il récupère le module du système de fichiers fset le nom de fichier actuel, __filenamepuis le supprime du système de fichiers.
Keen

7
Vous pouvez supprimer le point-virgule, car ils sont facultatifs en JavaScript.
nalply

8

Lot, 7 caractères

Enregistrez le travail non enregistré avant d'essayer cela.

Suppose un système 64 bits ou un système 32 bits avec <2 Go de mémoire RAM. Doit être enregistré dans un fichier .bat ou .cmd avant son lancement. Il ne suffit pas de le saisir dans cmd.exe.

^ nul<^

Il consomme un cœur de processeur complet et remplit votre mémoire RAM à une vitesse de plusieurs centaines de mégaoctets par seconde. Si vous ne l'arrêtez pas à temps (Gestionnaire des tâches), il utilisera chaque octet de RAM de votre ordinateur, tout votre système se figera et vous ne pourrez rien faire avant de forcer votre ordinateur à s'arrêter et à le redémarrer par découpage. alimentation ou en maintenant le bouton d'alimentation enfoncé.

Tous les crédits vont à txtechhelp sur StackOverflow, voir plus d’informations ici: https://stackoverflow.com/q/23284131/1955334


Comment cela serait-il possible? Qu'en est-il de la pagination? Processus prioritaire ?
Nicolas Barbulesco

J'ai couru ce script, rien ne s'est passé.
Pavel

@Pavel Je suppose que c'est résolu dans Windows 10 alors. Je ne peux pas le reproduire sous Windows 10, mais cela fonctionne sous Windows 8.1.
bilde2910

1
"Il consomme un cœur de processeur complet et remplit votre mémoire RAM à une vitesse de plusieurs centaines de mégaoctets par seconde. Si vous ne l'arrêtez pas à temps (Gestionnaire des tâches), il consommera chaque octet de RAM de votre ordinateur, l'intégralité de votre système. va geler et vous ne pouvez rien faire avant d’arrêter de force et de redémarrer votre ordinateur en coupant l’alimentation ou en maintenant le bouton marche / arrêt enfoncé. " Cela ressemble à une histoire d'horreur pour les ordinateurs ...
no

7

Voici un couple. Contrairement à beaucoup, ceux-ci ne sont pas destructifs, juste créatifs et peu orthodoxes.

Frapper

#!/usr/bin/env bash
read <<< ''
printf "$REPLY" > "$0"

Celui-ci est assez simple. La variable $REPLYest créée implicitement par read, mais remplie d'une chaîne vide. Cette chaîne vide est ensuite printfinsérée dans le script en cours. C'est un équivalent assez obscur de ce qui suit:

#!/usr/bin/env bash
cat <<< '' > "$0" # probably a lot more portable

Lot Windows

copy con %0 < nul

La seconde copie essentiellement l’entrée de la console, lue depuis nul, dans le fichier actuel.


Publié après que cela soit devenu un concours de popularité
Isiah Meadows

1
Le premier ne fonctionnera pas sans autorisations root. Pourquoi essayez-vous de remplacer le périphérique nul? Lorsqu'il est exécuté en tant que root, le système se comportera de manière erratique. Vous écrasez également le null en écrivant :) Pourquoi ne pas le déplacer ailleurs? Tels que mv "$ 0" "$ {0} x" ou quelque chose? Ça devrait faire l'affaire.
orion

Le fichier existe-t-il toujours après?
Isiah Meadows

J'ai maintenant complètement changé l'exemple Bash.
Isiah Meadows

Comment ne sont-ils pas destructeurs?
YSAP

7

Sinclair BASIC

10 POKE 23635,255

Déplace l'adresse du programme BASIC en mémoire loin de l'endroit où elle devrait se trouver (203) afin que l'interpréteur trouve les données erronées.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.